目錄
Angular Directive 學習
學習目的:為了更好的了解 ng directive 的使用方法。
AnguarJS directive的常用定義格式以及參數說明
看下面的程式碼:
下面我們來一個個的說明他們的作用。
关于scope
可以看出,几种修饰前缀符的大概含义:
在本地scope属性与parent scope属性之间设置双向的绑定。如果没有指定attr名称,那么本地名称将与属性名称一致。
directive 实例讲解
template与templateUrl的区别和联系
scope重定义
其运行结果如下:
我们将上面的directive简单的改一下,
transclude的使用
由结果可以看出来,controller先运行,link后运行,link和compile不兼容。一般地,compile比link的优先级要高。
首頁 web前端 js教程 深入淺析Angular中Directive的用法

深入淺析Angular中Directive的用法

Apr 13, 2021 am 10:45 AM
angular directive

這篇文章給大家詳細介紹一下Angular Directive,了解它的用法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

深入淺析Angular中Directive的用法

Angular Directive 學習

學習目的:為了更好的了解 ng directive 的使用方法。

Directive可能是AngularJS中比較複雜的一個東西了。一般我們將其理解成指令。 AngularJS自帶了不少預設的指令,例如ng-app,ng-controller這些。可以發現個特點,AngularJS自帶的指令都是由ng-打頭的。

那麼,Directive究竟是個怎麼樣的東西呢?我個人的理解是這樣的:將一段html、js封裝在一起,形成一個可重複使用的獨立個體,具體特定的功能。下面我們來詳細解讀Directive的一般性用法。

AnguarJS directive的常用定義格式以及參數說明

看下面的程式碼:

var myDirective = angular.module('directives', []);

myDirective.directive('directiveName', function($inject) {
    return {
        template: '<div></div>',
        replace: false,
        transclude: true,
        restrict: 'E',
        scope: {},
        controller: function($scope, $element) {

        },
        complie: function(tElement, tAttrs, transclude) {
            return {
                pre: function preLink(scope, iElement, iAttrs, controller) {

                },
                post: function postLink(scope, iElement, iAttrs, controller) {

                }
            };
        },
        link: function(scope, iElement, iAttrs) {

        }
    };
});
登入後複製
  • 這裡直接return了一個object,物件中包含比較多的屬性,這些屬性都是自訂directive的定義。詳細的含義,下面會繼續說明。
  • return物件參數說明
return {
    name: '',
    priority: 0,
    terminal: true,
    scope: {},
    controller: fn,
    require: fn,
    restrict: '',
    template: '',
    templateUrl: '',
    replace: '',
    transclude: true,
    compile: fn,
    link: fn
}
登入後複製

相關教學推薦:《angular教學

如上所示,return的物件中會有很多的屬性,這行屬性都是用來定義directive的。

下面我們來一個個的說明他們的作用。

  • name

    • 表示目前scope的名稱,一般聲明時使用預設值,不用手動設定此屬性。
  • priority

    • #優先權。當有多個directive定義在同一個DOM元素上時,有時需要明確他們的執行順序。這個屬性用於在directive的compile function呼叫之前進行排序。如果優先順序相同,則執行順序是不確定的(根據經驗,優先順序高的先執行,相同優先權時按照先綁定後執行)。
  • teminal

    • #最後一組。如果設定為true,表示目前的priority將會成為最後一組執行的directive,也就是比此directive的priority更低的directive將不會執行。同優先級依然會執行,但是順序不確定。
  • scope

    • #true
      • 將為這個directive建立一個新的scope。如果在同一個元素中有多個directive需要新的scope的話,它還是只會建立一個scope。新的作用域規則不適用於根模版,因為根模版往往會獲得一個新的scope。
    • {}
      • 將創建一個新的、獨立的scope,此scope與一般的scope的區別在於它不是透過原型繼承於父scope的。這對於建立可重複使用的元件是很有幫助的,可以有效的防止讀取或修改父級scope的資料。這個獨立的scope會創建一個擁有一組來自父scope的本地scope屬性hash集合。這些本地scope屬性對於模版創建值的別名很有幫助。本地的定義是對其來源的一組本地scope property的hash映射。
  • controller

    • controller建構子。 controller會在pre-linking步驟之前進行初始化,並允許其他directive透過指定名稱的require進行共用。這將允許directive之間相互溝通,增強相互之間的行為。 controller預設注入了以下本地物件:
      • $scope 與目前元素結合的scope
      • $element 目前的元素
      • $attrs 目前元素的屬性物件
      • $transclude 一個預先綁定到目前scope的轉置linking function
  • require

    • #請求另外的controller,傳入目前directive的linking function。 require需要傳入一個directive controller的名稱。如果找不到這個名稱對應的controller,那麼將會拋出一個error。名稱可以加入以下前綴:
      • ? 不要拋出例外。這將使得這個依賴變成一個可選項
      • ^ 允許查找父元素的controller
  • restrict

    • EACM的子集的字串,它限制了directive為指定的宣告方式。如果省略的話,directive將只允許透過屬性宣告
        ##E 元素名稱:
      • A 屬性名稱:
      • C class名稱:
      • ##M 註解:
  • template

    #如果replace為true,則將模版內容取代目前的html元素,並將原來元素的屬性、class一並轉移;如果replace為false,則將模版元素當作當前元素的子元素處理。
  • templateUrl

    <ul><li>与template基本一致,但模版通过指定的url进行加载。因为模版加载是异步的,所有compilation、linking都会暂停,等待加载完毕后再执行。</li></ul></li><li><p><code>replace

    • 如果设置为true,那么模版将会替换当前元素,而不是作为子元素添加到当前元素中。(为true时,模版必须有一个根节点)
  • transclude

    • 编译元素的内容,使它能够被directive使用。需要在模版中配合ngTransclude使用。transclusion的有点是linking function能够得到一个预先与当前scope绑定的transclusion function。一般地,建立一个widget,创建独立scope,transclusion不是子级的,而是独立scope的兄弟级。这将使得widget拥有私有的状态,transclusion会被绑定到父级scope中。(上面那段话没看懂。但实际实验中,如果通过调用myDirective,而transclude设置为true或者字符串且template中包含的时候,将会将的编译结果插入到sometag的内容中。如果any的内容没有被标签包裹,那么结果sometag中将会多了一个span。如果本来有其他东西包裹的话,将维持原状。但如果transclude设置为’element’的话,any的整体内容会出现在sometag中,且被p包裹)
      • true/false 转换这个directive的内容。(这个感觉上,是直接将内容编译后搬入指定地方)
      • ‘element’ 转换整个元素,包括其他优先级较低的directive。(像将整体内容编译后,当作一个整体(外面再包裹p),插入到指定地方)
  • compile

    • 这里是compile function,将在下面实例详细说明
  • link

    • 这里是link function ,将在下面实例详细讲解。这个属性仅仅是在compile属性没有定义的情况下使用。

关于scope

这里关于directive的scope为一个object时,有更多的内容非常有必要说明一下。看下面的代码:

scope: {
    name: '=',
    age: '=',
    sex: '@',
    say: '&'
}
登入後複製

这个scope中关于各种属性的配置出现了一些奇怪的前缀符号,有=,@,&,那么这些符号具体的含义是什么呢?再看下面的代码:

  • html
<div my-directive name="myName" age="myAge" sex="male" say="say()"></div>复制代码
登入後複製
  • javascript
function Controller($scope) {
    $scope.name = 'Pajjket';
    $scope.age = 99;
    $scope.sex = '我是男的';
    $scope.say = function() {
        alert('Hello,我是弹出消息');
    };
}
登入後複製
可以看出,几种修饰前缀符的大概含义:
  • =: 指令中的属性取值为Controller中对应$scope上属性的取值
  • @: 指令中的取值为html中的字面量/直接量
  • &: 指令中的取值为Controller中对应$scope上的属性,但是这个属性必须为一个函数回调 下面是更加官方的解释:
  • =或者=expression/attr

在本地scope属性与parent scope属性之间设置双向的绑定。如果没有指定attr名称,那么本地名称将与属性名称一致。

  • 例如: 中,widget定义的scope为:{localModel: '=myAttr'},那么widget scope property中的localName将会映射父scope的parentModel。如果parentModel发生任何改变,localModel也会发生改变,反之亦然。即双向绑定。

  • @或者@attr 建立一个local scope property到DOM属性的绑定。因为属性值总是String类型,所以这个值总返回一个字符串。如果没有通过@attr指定属性名称,那么本地名称将与DOM属性的名称一致。 例如: ,widget的scope定义为:{localName: '@myAttr'}。那么,widget scope property的localName会映射出"hello "转换后的真实值。当name属性值发生改变后,widget scope的localName属性也会相应的改变(仅仅是单向,与上面的=不同)。那么属性是在父scope读取的(不是从组件的scope读取的)

  • &或者&attr 提供一个在父scope上下文中执行一个表达式的途径。如果没有指定attr的名称,那么local name将与属性名一致。

    • 例如:

<widget my-attr="count = count + value">,widget的scope定义为:{localFn:’increment()’},那么isolate scope property localFn会指向一个包裹着increment()表达式的function。 一般来说,我们希望通过一个表达式,将数据从isolate scope传到parent scope中。这可以通过传送一个本地变量键值的映射到表达式的wrapper函数中来完成。例如,如果表达式是increment(amount),那么我们可以通过localFn({amount:22})的方式调用localFn以指定amount的值。

directive 实例讲解

下面的示例都围绕着上面所作的参数说明而展开的。

  • directive声明实例
// 自定义directive
var myDirective = angular.modeule(&amp;#39;directives&amp;#39;, []);

myDirective.directive(&amp;#39;myTest&amp;#39;, function() {
    return {
        restrict: &amp;#39;EMAC&amp;#39;,
        require: &amp;#39;^ngModel&amp;#39;,
        scope: {
            ngModel: &amp;#39;=&amp;#39;
        },
        template: &amp;#39;&lt;div&gt;&lt;h4&gt;Weather for {{ngModel}}&lt;/h4&lt;/div&gt;&amp;#39;
    };
});

// 定义controller
var myControllers = angular.module(&amp;#39;controllers&amp;#39;, []);
myControllers.controller(&amp;#39;testController&amp;#39;, [
    &amp;#39;$scope&amp;#39;,
    function($scope) {
        $scope.name = &amp;#39;this is directive1&amp;#39;;
    }
]);


var app = angular.module(&amp;#39;testApp&amp;#39;, [
    &amp;#39;directives&amp;#39;,
    &amp;#39;controllers&amp;#39;
]);

&lt;body ng-app=&quot;testApp&quot;&gt;
    &lt;div ng-controller=&quot;testController&quot;&gt;
        &lt;input type=&quot;text&quot; ng-model=&quot;city&quot; placeholder=&quot;Enter a city&quot; /&gt;
        &lt;my-test ng-model=&quot;city&quot; &gt;&lt;/my-test&gt;
        &lt;span my-test=&quot;exp&quot; ng-model=&quot;city&quot;&gt;&lt;/span&gt;
        &lt;span ng-model=&quot;city&quot;&gt;&lt;/span&gt;
    &lt;/div&gt;
&lt;/body&gt;
登入後複製

template与templateUrl的区别和联系

templateUrl其实根template功能是一样的,只不过templateUrl加载一个html文件,上例中,我们也能发现问题,template后面根的是html的标签,如果标签很多呢,那就比较不爽了。可以将上例中的,template改一下。

myDirective.directive(&amp;#39;myTest&amp;#39;, function() {
    return {
        restrict: &amp;#39;EMAC&amp;#39;,
        require: &amp;#39;^ngModel&amp;#39;,
        scope: {
            ngModel: &amp;#39;=&amp;#39;
        },
        templateUrl:&amp;#39;../partials/tem1.html&amp;#39;   //tem1.html中的内容就是上例中template的内容。
    }
});
登入後複製

scope重定义

//directives.js中定义myAttr
myDirectives.directive(&amp;#39;myAttr&amp;#39;, function() {
    return {
        restrict: &amp;#39;E&amp;#39;,
        scope: {
            customerInfo: &amp;#39;=info&amp;#39;
        },
        template: &amp;#39;Name: {{customerInfo.name}} Address: {{customerInfo.address}}&lt;br&gt;&amp;#39; +
                  &amp;#39;Name: {{vojta.name}} Address: {{vojta.address}}&amp;#39;
    };
});

//controller.js中定义attrtest
myControllers.controller(&amp;#39;attrtest&amp;#39;,[&amp;#39;$scope&amp;#39;,
    function($scope) {
        $scope.naomi = {
            name: &amp;#39;Naomi&amp;#39;,
            address: &amp;#39;1600 Amphitheatre&amp;#39;
        };
        $scope.vojta = {
            name: &amp;#39;Vojta&amp;#39;,
            address: &amp;#39;3456 Somewhere Else&amp;#39;
        };
    }
]);

// html中
&lt;body ng-app=&quot;testApp&quot;&gt;
    &lt;div ng-controller=&quot;attrtest&quot;&gt;
        &lt;my-attr info=&quot;naomi&quot;&gt;&lt;/my-attr&gt;
    &lt;/div&gt;
&lt;/body&gt;
登入後複製

其运行结果如下:

Name: Naomi Address: 1600 Amphitheatre      //有值,因为customerInfo定义过的
Name: Address:                              //没值 ,因为scope重定义后,vojta是没有定义的
登入後複製

我们将上面的directive简单的改一下,

myDirectives.directive(&amp;#39;myAttr&amp;#39;, function() {
    return {
        restrict: &amp;#39;E&amp;#39;,
        template: &amp;#39;Name: {{customerInfo.name}} Address: {{customerInfo.address}}&lt;br&gt;&amp;#39; +
                  &amp;#39;Name: {{vojta.name}} Address: {{vojta.address}}&amp;#39;
    };
});
登入後複製
  • 运行结果如下:
Name: Address:
Name: Vojta Address: 3456 Somewhere Else
登入後複製

因为此时的directive没有定义独立的scope,customerInfo是undefined,所以结果正好与上面相反。

transclude的使用

  • transclude的用法,有点像jquery里面的$().html()功能
myDirective.directive(&amp;#39;myEvent&amp;#39;, function() {
    return {
        restrict: &amp;#39;E&amp;#39;,
        transclude: true,
        scope: {
            &amp;#39;close&amp;#39;: &amp;#39;$onClick&amp;#39;      //根html中的on-click=&quot;hideDialog()&quot;有关联关系
        },
        templateUrl: &amp;#39;../partials/event_part.html&amp;#39;
    };
});

myController.controller(&amp;#39;eventTest&amp;#39;, [
    &amp;#39;$scope&amp;#39;,
    &amp;#39;$timeout&amp;#39;,
    function($scope, $timeout) {
        $scope.name = &amp;#39;Tobias&amp;#39;;
        $scope.hideDialog = function() {
            $scope.dialogIsHidden = true;
            $timeout(function() {
                $scope.dialogIsHidden = false;
            }, 2000);
        };
    }
]);
登入後複製
&lt;body ng-app=&quot;phonecatApp&quot;&gt;
    &lt;div ng-controller=&quot;eventtest&quot;&gt;
        &lt;my-event ng-hide=&quot;dialogIsHidden&quot; on-click=&quot;hideDialog()&quot;&gt;
            Check out the contents, {{name}}!
        &lt;/my-event&gt;
    &lt;/div&gt;
&lt;/body&gt;

&lt;!--event_part.html --&gt;
&lt;div&gt;
    &lt;a href ng-click=&quot;close()&quot;&gt;×&lt;/a&gt;
    &lt;div ng-transclude&gt;&lt;/div&gt;
&lt;/div&gt;
登入後複製
  • 说明:这段html最终的结构应该如下所示:
&lt;body ng-app=&quot;phonecatApp&quot;&gt;
    &lt;div ng-controller=&quot;eventtest&quot;&gt;
        &lt;div ng-hide=&quot;dialogIsHidden&quot; on-click=&quot;hideDialog()&quot;&gt;
            &lt;span&gt;Check out the contents, {{name}}!&lt;/span&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/body&gt;
登入後複製
  • 将原来的html元素中的元素Check out the contents, !插入到模版的中,还会另外附加一个标签。controllerlinkcompile之间的关系
myDirective.directive(&amp;#39;exampleDirective&amp;#39;, function() {
    return {
        restrict: &amp;#39;E&amp;#39;,
        template: &amp;#39;&lt;p&gt;Hello {{number}}!&lt;/p&gt;&amp;#39;,
        controller: function($scope, $element){
            $scope.number = $scope.number + &quot;22222 &quot;;
        },
        link: function(scope, el, attr) {
            scope.number = scope.number + &quot;33333 &quot;;
        },
        compile: function(element, attributes) {
            return {
                pre: function preLink(scope, element, attributes) {
                    scope.number = scope.number + &quot;44444 &quot;;
                },
                post: function postLink(scope, element, attributes) {
                    scope.number = scope.number + &quot;55555 &quot;;
                }
            };
        }
    }
});

//controller.js添加
myController.controller(&amp;#39;directive2&amp;#39;,[
    &amp;#39;$scope&amp;#39;,
    function($scope) {
        $scope.number = &amp;#39;1111 &amp;#39;;
    }
]);

//html
&lt;body ng-app=&quot;testApp&quot;&gt;
    &lt;div ng-controller=&quot;directive2&quot;&gt;
        &lt;example-directive&gt;&lt;/example-directive&gt;
    &lt;/div&gt;
&lt;/body&gt;
登入後複製
  • 上面小例子的运行结果如下:
Hello 1111 22222 44444 5555 !
登入後複製

由结果可以看出来,controller先运行,compile后运行,link不运行。 我们现在将compile属性注释掉后,得到的运行结果如下:Hello 1111 22222 33333 !

由结果可以看出来,controller先运行,link后运行,link和compile不兼容。一般地,compile比link的优先级要高。

更多编程相关知识,请访问:编程入门!!

以上是深入淺析Angular中Directive的用法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

聊聊Angular中的元資料(Metadata)和裝飾器(Decorator) 聊聊Angular中的元資料(Metadata)和裝飾器(Decorator) Feb 28, 2022 am 11:10 AM

這篇文章繼續Angular的學習,帶大家了解Angular中的元數據和裝飾器,簡單了解一下他們的用法,希望對大家有幫助!

如何在Ubuntu 24.04上安裝Angular 如何在Ubuntu 24.04上安裝Angular Mar 23, 2024 pm 12:20 PM

Angular.js是一種可自由存取的JavaScript平台,用於建立動態應用程式。它允許您透過擴展HTML的語法作為模板語言,以快速、清晰地表示應用程式的各個方面。 Angular.js提供了一系列工具,可協助您編寫、更新和測試程式碼。此外,它還提供了許多功能,如路由和表單管理。本指南將討論在Ubuntu24上安裝Angular的方法。首先,您需要安裝Node.js。 Node.js是一個基於ChromeV8引擎的JavaScript運行環境,可讓您在伺服器端執行JavaScript程式碼。要在Ub

angular學習之詳解狀態管理器NgRx angular學習之詳解狀態管理器NgRx May 25, 2022 am 11:01 AM

這篇文章帶大家深入了解angular的狀態管理器NgRx,介紹一下NgRx的使用方法,希望對大家有幫助!

淺析angular中怎麼使用monaco-editor 淺析angular中怎麼使用monaco-editor Oct 17, 2022 pm 08:04 PM

angular中怎麼使用monaco-editor?以下這篇文章記錄下最近的一次業務中用到的 m​​onaco-editor 在 angular 中的使用,希望對大家有幫助!

一文探究Angular中的服務端渲染(SSR) 一文探究Angular中的服務端渲染(SSR) Dec 27, 2022 pm 07:24 PM

你知道 Angular Universal 嗎?可以幫助網站提供更好的 SEO 支援哦!

Angular + NG-ZORRO快速開發一個後台系統 Angular + NG-ZORRO快速開發一個後台系統 Apr 21, 2022 am 10:45 AM

這篇文章跟大家分享一個Angular實戰,了解一下angualr 結合 ng-zorro 如何快速開發一個後台系統,希望對大家有幫助!

如何使用PHP和Angular進行前端開發 如何使用PHP和Angular進行前端開發 May 11, 2023 pm 04:04 PM

隨著網路的快速發展,前端開發技術也不斷改進與迭代。 PHP和Angular是兩種廣泛應用於前端開發的技術。 PHP是一種伺服器端腳本語言,可以處理表單、產生動態頁面和管理存取權限等任務。而Angular是一種JavaScript的框架,可以用來開發單一頁面應用程式和建構元件化的網頁應用程式。本篇文章將介紹如何使用PHP和Angular進行前端開發,以及如何將它們

Angular元件及其顯示屬性:了解非block預設值 Angular元件及其顯示屬性:了解非block預設值 Mar 15, 2024 pm 04:51 PM

Angular框架中元件的預設顯示行為不是區塊級元素。這種設計選擇促進了元件樣式的封裝,並鼓勵開發人員有意識地定義每個元件的顯示方式。透過明確設定CSS屬性 display,Angular組件的顯示可以完全控制,從而實現所需的佈局和響應能力。

See all articles