Angular的自定義指令以及實例

来源:http://www.cnblogs.com/liuhongjin/archive/2016/12/26/6222071.html
-Advertisement-
Play Games

本文章已收錄於: AngularJS知識庫 AngularJS知識庫 分類: javascript(55) 分類: javascript(55) http://www.cnblogs.com/xiaoxie53/p/5058198.html 前面的文章介紹了很多angular自帶的指令,下麵我們看看 ...


本文章已收錄於:   AngularJS知識庫  分類:

http://www.cnblogs.com/xiaoxie53/p/5058198.html

 

前面的文章介紹了很多angular自帶的指令,下麵我們看看如何使用directive自定義指令。

先看一個例子:

複製代碼
<body>
    <div my-hello></div>
</body>

<script type="text/javascript">
var m1 = angular.module('myApp',[]);
m1.directive('myHello',function(){
    return {
        restrict : 'A',
        replace : true,
        template : '<div>hello angular</div>'
    };
});
</script>
複製代碼

1:我們定義了一個my-hello的指令。

2:使用directive完善這個指令,返回一個對象。有三個值:

  a) :restrict共四個值:E:標簽指令,C:class指令,M:註釋指令,A:屬性指令

    如何使用 ?

    

  b):replace是否替換(M註釋必須為true才能解析)看圖:

    true:

    false:

 

   c):template內容,除此之外還有templateUrl,指定一個html模板文件。

 

 

下麵再舉個例子:

 

複製代碼
<div ng-controller="Aaa">
    <div my-tab my-id="div1" my-name="name" my-fn="show(num)" class="J-tab"></div>
    <div my-tab my-id="div2" my-name="name" my-fn="show(num)" class="J-tab"></div>
</div>
<script type="text/javascript">

var m1 = angular.module('myApp',[]);

m1.controller('Aaa',['$scope',function($scope){
    $scope.name = 'xiecg';
    $scope.age = 18;
    $scope.show = function(num){
        console.log(num);
    };
}]);


m1.directive('myTab',function(){
    return {
        restrict : 'ECMA',
        replace : true,    //替換的方式插入內容//綁定策略
        scope : {
            myId : '@',        //解析普通字元串
            myName : '=',    //解析數據
            myFn : '&'        //函數
        },
        controller : ['$scope',function($scope){
            //共用數據存放在這裡
            $scope.name = 'this is a xiecg';
        }],
        template : '<div id="{{myId}}">\
                    <input type="button" value="1" class="active" ng-click="myFn({num:456})">\
                    <input type="button" value="2">\
                    <input type="button" value="3">\
                    <div style="display:block;">{{myName}}</div>\
                    <div>2222</div>\
                    <div>3333</div>\
                </div>'
    };
});

</script>
複製代碼

 

 

1:scope預設是false,為true表示獨立作用域。

2:scope給予一個對象時,表示執行綁定策略,在template上調用這些數據。

  a):我們在DOM元素上my-id,我們使用@符號,表示解析普通字元串,說白了就是你寫什麼就是什麼。

  b):使用=符號,表示解析數據。

  c):使用&符號,表示這綁定一個函數。

3:controller,表示綁定指令內部使用的數據。

 

好,下麵來繼續完善這個tab切換的例子!

完整代碼:

複製代碼
<!DOCTYPE HTML>
<html ng-app="myApp">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Tab選項卡實例</title>
<style type="text/css">
    .J-tab .active{background-color:#03A9F4;}
    .J-tab div{display:none;}
</style>
<script type="text/javascript" src="js/jquery-1.11.1.js"></script>
<script type="text/javascript" src="js/angular.min.js"></script>
</head>
<body>

<div ng-controller="Aaa">
    <my-tab my-id="div1" my-data="sports" class="J-tab"></my-tab>
    <my-tab my-id="div2" my-data="time" class="J-tab"></my-tab>
</div>

<script type="text/javascript">

var m1 = angular.module('myApp',[]);
m1.controller('Aaa',['$scope',function($scope){
    $scope.sports = [
        {title : '籃球',content : '111111111'},
        {title : '足球',content : '222222222'},
        {title : '排球',content : '333333333'}
    ];
    $scope.time = [
        {title : '上午',content : '444444444'},
        {title : '中午',content : '555555555'}
    ];
}]);

m1.directive('myTab',function(){
    return {
        restrict : 'E',
        replace : true,
        scope : {
            myId : '@',
            myData : '='
        },
        controller : ['$scope',function($scope){
            $scope.name = 'this is a xiecg';
        }],
        template : '<div id="{{myId}}">\
                    <input ng-repeat="data in myData" type="button" ng-value="data.title" ng-class="{active:$first}">\
                    <div ng-repeat="data in myData" ng-style="{display:$first?\'block\':\'none\'}">{{data.content}}</div>\
                </div>',
        link : function(scope,element,attr){
            element.on('click','input',function(){
                var self = $(this) , i = self.index();
                self.addClass('active').siblings('input').removeClass('active');
                self.siblings('div').eq(i).show().siblings('div').hide();
            });
        }
    };
});


</script>
</body>
</html>
複製代碼

 

 link屬性,表示當directive被angular編譯後,執行該方法。這個方法接受三個參數,

a):scope表示controller下麵的數據。

b):element表示當前的DOM元素。

c):attr表示這個DOM元素上的自定義屬性。

 

 

 

補充:

在實際的開發過程中我們往往需要嵌套各種組件和指令。下麵來介紹directive中的transclude和require。

 

複製代碼
<!DOCTYPE HTML>
<html ng-app="myApp">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>自定義指令間的互相交互</title>
<script type="text/javascript" src="js/angular.min.js"></script>
</head>
<body>

<div>
    <hello>
        <hi></hi>
    </hello>
</div>

<script type="text/javascript">

var m1 = angular.module('myApp',[]);

m1.directive('hello',function(){
    return {
        restrict : 'E',
        replace : true,
        transclude : true,   //允許自定義指令的嵌套,通過ng-transclude指定嵌套的範圍
        controller : function($scope){
            $scope.name = 'xiecg';
            this.name = 'xiecg';    //使用this共用給其他指令
        },
        template : '<div>hello angular <h1 ng-transclude></h1></div>'
    };
});

m1.directive('hi',function(){
    return {
        restrict : 'E',
        replace : true,
        require : '^hello',//hello指令屬性hi指令的父級,需要用^符號指定。如果無法指定,使用?容錯處理。
        template : '<span>hi angular {{name}}</span>',
        link : function(scope,element,attr,reController){
            console.log(reController);    //得到父級hello指令中共用出來的數據
        }
    };
});

</script>
</body>
</html>
複製代碼
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 為什麼會有BFC和IFC 首先要先瞭解兩個概念:Box和formatting context; Box:CSS渲染的時候是以Box作為渲染的基本單位。Box的類型由元素的類型和display屬性決定,box的類型分為block-level box 和inline-level box(不包括cs ...
  • 一個字元串數組,{,a,b,1,110,111,13,2,23,22,23442,2645,345,34567,34,3487,5643,64545454,56457,7654564} 寫一個函數,返回結果為{1,2,34,5643,64545454,56457,7654564} 規律,數字判斷,如 ...
  • 1. returnDetail.$mount('#returnDetail'); 不用el 直接可以綁定數據到頁面的id上 作用區域不能交疊多個vue 實體 否則後面的vue 實體會失效。 2. vue created 運行在讀取data 之後, 綁定到數據之前, 如果不想顯示 {{}} 就可以在頁 ...
  • 1.audio自動播放 1 <audio src='xxx.mp3' autoplay></audio> 上面是audio標簽autoplay屬性是自動播放,但是在安卓部分瀏覽器和ios的safari是不會自動播放。在微信,安卓和ios大部分機子都可以知道播放。測試iphone5和iphone6s在 ...
  • 這是我前端生涯第一次和後臺對接,其經歷真是苦不堪言,多次絕處逢生,柳暗花明,可就是遲遲見不到那條村子。當然,最後我還是完成了這次對接。下麵來聊一聊我這白痴一般的經歷。 序章 話說天下大勢,分久必合,合久必分。2016年,程式員的角色已經有了很大的分化,後端、前端、移動端、演算法各領功能變數名稱家輩出,他們都是 ...
  • 原文鏈接: "https://github.com/AlloyTeam/AlloyTouch/wiki/Scoped CSS" 寫在前面 問:什麼是Scoped CSS規範? Scoped CSS規範是Web組件產生不污染其他組件,也不被其他組件污染的CSS規範。 面對組件化的普及,組件的復用很普遍 ...
  • 1.結構性定義 文件類型 <HTML></HTML> (放在檔案的開頭與結尾) 文件主題 <TITLE></TITLE> (必須放在「文頭」區塊內) 文頭 <HEAD></HEAD> (描述性資料,像是「主題」) 文體 <BODY></BODY> (文件本體) (由瀏覽器控制的顯示風格) 標題 <H ...
  • 由[OpenDigg](http://www.opendigg.com/) 出品的前端開源項目周報第三期來啦。我們的前端開源周報集合了OpenDigg一周來新收錄的優質的前端開發方面的開源項目,方便前端開發人員便捷的找到自己需要的項目工具等 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...