首頁 > web前端 > js教程 > 聊聊angular指令中的preLink和postLink函數

聊聊angular指令中的preLink和postLink函數

青灯夜游
發布: 2021-05-19 10:08:23
轉載
2877 人瀏覽過

本篇文章跟大家介紹一下angular指令中的preLink和postLink函數。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

聊聊angular指令中的preLink和postLink函數

【相關推薦:《angular教學》】

指令範本選項有complie和link兩個字段,兩者之間存在如下關係:

  • 當compile欄位存在時,link欄位將被忽略,compile函數的回傳值將作為link欄位。
  • 當compile不存在,link欄位存在時,angular透過這樣directive.compile = valueFn(directive.link);包裝一層,使用使用者定義的link欄位。

而link分為preLink和postLink兩個階段,從link欄位或是compile函數的回傳值來看:

  • 如果是函數,那麼這樣的link,會被認為是postLink。
  • 如果是對象,那麼link.pre作為preLink函數,link.post作為postLink函數。
app.directive('myDirective', function () {
  return {
      compile: function () {
          return {
              pre: function () {
                  console.log('preLink');
              },
              post: function () {
                  console.log('postLink');
              }
          }
      }
  }
});
登入後複製

我們的指令工廠返回的是一個函數,那麼angular透過這樣的包裝 directive = { compile: valueFn(directive) },即該函數將作為指令對象的postLink函數,像這樣:

app.directive('myDirective', function () {
  return function () {
    console.log('postLink');
  }
});
登入後複製

angular編譯連結指令的順序

為了看清angular編譯連結指令的順序,用以下程式碼輸出日誌的方式來說明:  

<body ng-app="myApp">
    <A a1>
        <B b1 b2></B>
        <C>
            <E e1></E>
            <F>
              <G></G>
            </F>
        </C>
        <D d1></D>
    </A>
</body>
 
var app = angular.module(&#39;myApp&#39;, []);
var names = [&#39;a1&#39;, &#39;b1&#39;, &#39;b2&#39;, &#39;e1&#39;, &#39;d1&#39;];
 
names.forEach(function (name) {
  app.directive(name, function () {
    return {
        compile: function () {
             console.log(name + &#39; compile&#39;);
            return {
                pre: function () {
                    console.log(name + &#39; preLink&#39;);
                },
                post: function () {
                    console.log(name + &#39; postLink&#39;);
                }
            };
        }
    };
  });
});
登入後複製

輸出:

a1 compile
b1 compile
b2 compile
e1 compile
d1 compile
a1 preLink
b1 preLink
b2 preLink
b2 postLink
b1 postLink
e1 preLink
e1 postLink
d1 preLink
d1 postLink
a1 postLink
登入後複製

可以看出:

  • 所有的指令都是先compile,然後preLink,然後postLink。

  • 節點指令的preLink是在所有子節點指令preLink,postLink之前,所以一般這裡就可以透過scope給子節點傳遞一定的訊息。

  • 節點指令的postLink是在所有子節點指令preLink,postLink完畢之後,也就意味著,當父節點指令執行postLink時,子節點postLink已經都完成了,此時子dom樹已經穩定,所以我們大部分dom操作,訪問子節點都在這個階段。

  • 指令在link的過程,其實是一個深度優先遍歷的過程,postLink的執行其實是一個回溯的過程。

  • 節點上的可能有若干指令,在蒐集的時候就會按一定順序排列(透過byPriority排序),執行的時候,preLinks是正序執行,而postLinks則是倒序執行。

明白了這些以後,就要小心一些容易忽略的陷阱。

<body ng-app="myApp">
    <my-parent></my-parent>
</body>
 
var app = angular.module(&#39;myApp&#39;, []);
 
app.directive(&#39;myParent&#39;, function () {
    return {
        restrict: &#39;EA&#39;,
        template: &#39;<div>{{greeting}}{{name}}&#39;+
        &#39;<my-child></my-child>&#39;+
        &#39;</div>&#39;,
        link: function(scope,elem,attr){
            scope.name = &#39;Lovesueee&#39;;
            scope.greeting = &#39;Hey, I am &#39;;
        }
    };
});
app.directive(&#39;myChild&#39;, function () {
    return {
        restrict: &#39;EA&#39;,
        template: &#39;<div>{{says}}</div>&#39;,
        link: function(scope,elem,attr){
            scope.says = &#39;Hey, I am child, and my parent is &#39; + scope.name;
        }
    };
});
登入後複製

結果子指令輸出為undefined

Hey, I am Lovesueee
Hey, I am child, and my parent is undefined
登入後複製

由上可以,myParent指令的link是一個postLink函數,而這個函數將在myChild指令的preLink和postLink執行完之後才執行。所以scope.name = undefined。

更多程式相關知識,請造訪:程式設計入門! !

以上是聊聊angular指令中的preLink和postLink函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板