1. 程式人生 > >Angular自定義指令之compile, link, controller屬性詳解及例項演示

Angular自定義指令之compile, link, controller屬性詳解及例項演示

本文章主要就angularjs指令中的compile,link及controller函式的使用和區別進行詳細討論。以下是本文的結構:

  1. directive的執行原理
  2. compile用法
  3. link 用法
  4. controller 用法
  5. compile,link及controller區別
  6. link和controller之間傳參

directive的執行原理

在詳細討論以上五點之前,先要討論下directive的執行原理。在AngularJS應用啟動前,指令都以html文字的形式儲存在文字編輯器中。當該應用啟動後,會進過兩個階段,即編譯階段和連結階段。之後,作用域(scope)會同html進行繫結,應用會對html中dom的操作進行實時響應。整個過程主要有兩個階段:

編譯階段: AngularJS會遍歷整個html文件並根據JS中的指令定義來處理頁面上宣告的指令。換句話說, 在遍歷dom時,所有的指令將被收集,但對dom樹還沒有進行資料繫結,此時對dom操作對效能影響很小。在編譯階段,同種 directive 在不同的 dom 節點出現一次,編譯也會隨之執行一次。然而,在這個階段 scope 是無法訪問到的。一個指令一旦編譯完成,馬上就可以通過編譯函式對其進行訪問,編譯函式的簽名包含有訪問指令宣告坐在的元素element以及鈣元素其他屬性attrs的方法。這個編譯函式會返回一個模板函式,包含有完整的解析樹。最後,模板函式被傳遞給編譯後的dom樹中,每個指令定義的連結函式。

連結階段: Angular 會把所有 directive 的事件監聽器註冊到dom中並建立對 scope(作用域)的監聽,並且把一個 scope 加到 directive 中。由於連結階段是在編譯階段之後進行的,所以這時的scope是可以訪問的。

compile用法

compile函式負責對模板dom進行轉換,它返回一個物件或者函式。compile本身相較於link函式不會那麼頻繁地使用。通常情況下,如果設定了compile函式,那就意味著可以在指令和實時資料被放到dom中之前對dom進行操作,在這個函式中進行例如新增或刪除節點等dom操作都是安全的。
注意:compile和link是相斥的。如果同時設定了兩項,compile返回的函式會被當作連結函式把後面定義的link函式所取代,也就是說,後面的link函式將起不到作用。

// ...
compile: function(element, attrs){
            var curEle = angular.element('id');
            return function(scope, element, attrs) {
                 //連結函式
            };
        }
// ...

link函式用法

link函式負責將作用域和dom進行連結,並對元素的註冊事件進行監聽。而在這個操作執行之前,可以手動操作dom。如果有了編譯函式,它會返回一個連結函式,不需要另外定義。如果自定義指令很簡單,可以從工廠函式返回一個函式來代替物件(見程式碼1),這樣也算是一個連結函式。一般來說,都可按照程式碼2來定義link函式(該函式的引數列表是固定的)。

程式碼1:

app.directive('myDirective', function() {
     return {
         pre: function(tElement, tAttrs, transclude) {
                //在子元素被連結之前執行
                //在這裡進行dom轉換不安全
                //之後呼叫link函式將無法定位要連結的元素
         }
     }, {
         post: function(tElement, tAttrs, transclude) {
                //在子元素被連結之後執行
                //這裡就相當於link函式,可以省略到編譯函式

         }
     }
});

程式碼2:

app.directive('myDirective', function() {
     return {
        link: function(scope, element, attrs, controller) {
         //controller是require中指定的控制器,名字不能寫錯,不然對應不起來...
        }
     }
});

controller用法

controller這裡的屬性值可以是一個字串(控制器名稱)或者函式(控制器內容)。如果屬性值為字串時,會以字串為控制器的名字,查詢在應用中已經註冊過的控制器的建構函式。

app.directive('myDirective', function() {
     return {
        controller: function($scope, $element, $attrs, $transclude) {
             //controller邏輯內容
        }
        or
        controller: 'MyController'
     }
});

一般在控制器內部操作dom與AngularJS的風格不符,所以需要通過連結函式來實現這個功能。
自定義指令的控制器和link函式是可以進行互換的。控制器主要用來提供可在指令間複用的行為,但是連結函式只能在當前內部指令中定義行為,且無法在指令間複用。

compile,link及controller區別

執行順序:

app.directive('myDirective', function() {
    return {
        restrict: 'AE',
        compile: function(tElem, tAttrs) {
            console.log(' compile start ');
            return {
                pre: function(scope, iElem, iAttrs) {
                    console.log('pre link start ');
                },
                //這裡的post函式想當於link函式
                post: function(scope, iElem, iAttrs) {
                    console.log('post link start ');
                }
            } 

        },
        controller: function($scope, $element, $attrs) {
            console.log(' controller start ');
        }
    };
});

結果:
這裡寫圖片描述
可見compile函式最先執行,其次是controller,然後是pre和post(link)函式。

作用:

  • compile:負責對模板dom進行轉換;
  • link: 負責將作用域和dom進行連結,並對元素的註冊事件進行監聽,只能在當前內部指令中定義行為,且無法在指令間複用;
  • controller:用來提供可在指令間複用的行為。

compile與link區別在於它們要做的事情不同,而link與controller在於這兩個函式上的定位。

link和controller之間傳參

相關推薦

Angular定義指令compile, link, controller屬性例項演示

本文章主要就angularjs指令中的compile,link及controller函式的使用和區別進行詳細討論。以下是本文的結構: directive的執行原理 compile用法 link 用法 controller 用法 compile,link及co

Angular定義指令scope屬性例項演示

本文將對AngularJS自定義指令詳解中的scope屬性配合例項演示,進行深度講解: scope屬性值可以是Boolean型別, 也可以是 Object型別, Boolean型別: scope值為false時,可以理解成指令內部並沒有一個新的sco

angular定義指令使用$compile動態生成html

<script> angular .module(‘app‘) .controller(‘SampleCtrl‘, function ($scope, $filter) { $scope.open

spring security起步三:定義登入配置與form-login屬性

在上一篇部落格spring security起步二:自定義登入頁中我們實現瞭如何自定義登入頁,但是還存在很多問題: 1.spring security如何對登入請求進行攔截 2.登入成功後如何跳轉 3.登入失敗後如何跳轉 form-login屬性詳解

angular 定義指令 --restrict、restrict、replace

emp bold span 類型 ret space con 設置 註意 Angularjs 允許根據實際業務需要自定義指令, 通過angular全局對象下的 directive 方法實現。可以自定義屬性、自定義標簽、自定義功能 接下來定義一個名叫custom的指令,並利用

Angular-定義指令-下

接下來 -h 模塊 use 相互 讓我 model too 服務 自定義指令學習有段時間了,學了些紙上談兵的東西,還沒有真正的寫個指令出來呢。。。所以,隨著學習的接近尾聲,本篇除了介紹剩余的幾個參數外,還將動手結合使用各參數,寫個真正能用的指令出來玩玩。   我們在自定義指

angular 定義指令 Directive

聲明 其他 原型繼承 創建 tool 兩個 模板 變化 組合 廢話不多說,下面就直接上代碼 //angular指令的定義,myDirective ,使用駝峰命名法 angular.module(‘myApp‘, []) .directive(‘myDirective‘,

Angular17 Angular定義指令

分類 dto end sel 數據 str too rdm cor 1 什麽是HTML   HTML文檔就是一個純文本文件,該文件包含了HTML元素、CSS樣式以及JavaScript代碼;HTML元素是由標簽呈現,瀏覽器會為每個標簽創建帶有屬性的DOM對象,瀏覽器通過渲染

Angular 定義指令

1.命名:      可以使用普通字串,也可以使用駝峰法來命名一個指令,例如 firstDirective, 但在使用它時需要以 - 分割: first-directive。 2.建立方式:     Angularjs的指令建立有四種形式,比如建立的指令hello:

Angular 定義指令

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></

建立angular定義指令

——本文轉自他處,稍作修改,完全為了方便自己理解,如有侵犯,請告知。 指令(Directives)是所有AngularJS應用最重要的部分。儘管AngularJS已經提供了非常豐富的指令,但還是經常需要建立應用特定的指令。 一個Angular指令可以有以下的四種表現形式:

angularjs 1.x定義指令控制器與指令間的通訊

一、在指令中呼叫控制器裡定義的方法 //html <div ng-controller="MyCtrl"> <loader howToLoad="loadData

angular定義指令

指令(directive)是angular裡面最核心也是最難懂的東西,在慕課網看了下大漠窮秋老溼的視訊,自己百度半天做了一些小test,總算把一切都搞明白了。 先列出學習來源: 一、指令的建立: 首先你得先建立一個module: var modu

Angular --- 定義指令更新

1.左滑刪除 <li ng-repeat="name in names" drag-to-dismiss="deleteTodo($index)" > …… </l

vue定義指令拖拽

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style>

安卓定義View進階-多點觸控

Android 多點觸控詳解,在前面的幾篇文章中我們大致瞭解了 Android 中的事件處理流程和一些簡單的處理方案,本次帶大家瞭解 Android 多點觸控相關的一些知識。 多點觸控 ( Multitouch,也稱 Multi-touch ),即同時接受螢幕上多個點的人機互動

安卓定義View進階-事件分發機制

Android 事件分發機制詳解,在上一篇文章 事件分發機制原理 中簡要分析了一下事件分發機制的原理,原理是十分簡單的,一句話就能總結:責任鏈模式,事件層層傳遞,直到被消費。 雖然原理簡單,但是隨著 Android 不斷的發展,實際運用場景也越來越複雜,所以想要徹底玩轉事件分發機制還

Android 定義控制元件-Canvas和Paint繪圖-手把手帶你繪製一個時鐘.

,Android - Paint基礎 在自定義控制元件時,經常需要使用canvas、paint等,在canvas類中,繪畫基本都是靠drawXXX()方法來完成的,在這些方法中,很多時候都需要用到paint型別的引數, Paint作為一個非常重要的元素,功能

[tensorflow 應用路]Batch Normalization 原理應用方法

批正則化(Batch Normalize,BN)是2015年由Sergey Ioffe提出的方法,用於消除神經網路上一層不同分佈的輸入導致本層引數更新困難。由於各個層的卷積核引數不同,根據反向傳播法則我們知道,∣∣W∣∣||W||∣∣W∣∣及結果∣∣h∣∣||h

React Native API模組Alert彈出框使用

(一)前言 今天我們繼續來一個Android、iOS平臺通用的彈出框Alert模組。 剛建立的React Native技術交流2群(496601483),歡迎各位大牛,React Native技術愛好者加入交流!同時部落格右側歡迎微信掃描關注訂閱號,移動技術乾貨,精彩文章技術推送! 該Alert模組