2014-02-15 75 views
0

我看到這個有很多的指令:僅編譯返回postLink的函數 - 它是否爲反模式?

compile: function(elm, attrs, transclude) { 
      return function postLink(scope, elm, attrs, tabsetCtrl) { 
        // do something with transclude function 
        } 
      } 

,我想確認我的理解,這是一個過時的形式做的事情,因爲角的舊版本沒有transclude在鏈接功能參數 和它的更好(更易讀)現在要做的:

link: function (scope, elm, attrs, tabsetCtrl, transclude) { 
     // do something with transclude function 
     } 

有當有編譯功能,沒有其他的身體這兩者之間有什麼區別? (我檢查了代碼示例,兩種方式的工作方式都是一樣的,但也許有些東西會導致第一種形式比第二種形式更好)

+1

兩個函數做同樣的事情,並且第一功能不會被棄用。只有在您聲明您的指令被隱藏的情況下才能使用Transclusion。存在鏈接 - >發佈鏈接。只有在需要預鏈接功能時才使用編譯,或者在鏈接函數執行之前需要進行dom轉換。 – igorzg

+0

來自Angular Docs: – Yoorek

+0

不,它不正確 - 來自Angular文檔 「注意:傳遞給編譯函數的transclude函數已被棄用,因爲它例如不知道正確的外部函數。請使用transclude函數而是傳遞給鏈接函數。「 我知道你寫的所有內容,但這不是我的問題的答案。我問實際上爲什麼有人會使用第一種形式,而第二種形式更具可讀性並且執行相同操作。許多人正在使用第一種形式。 – Yoorek

回答

0

您仍然不明白。只有在需要預先鏈接時才能使用編譯,並且只有在需要對任何子元素編譯之前對範圍執行一些準備時,才需要使用前導鏈接。 這裏是例子: http://plnkr.co/edit/x9FeRULhjJVxGWDDfAkk?p=preview 我想告訴你什麼是編譯和鏈接功能的區別,所以你可以理解何時需要編譯。因爲在你的情況下,編譯不需要它一樣的鏈接,但在新的角度你的回報

{ 
    transclude: true, 
    compile: function(elm, attrs) { 
      // you can do transformation of element before link also here 
      // which you cannot do in link function eg. 
      elem.addClass('testclass'); 
      // or like i did in example on link 
      elem.prepend('<span style="color:red;"> {{value}} </span> '); 

      return function(scope, elm, attrs, ctrl, transclude) { 

      } 
    } 
} 

,但在你的例子沒有轉換是一樣的鏈接功能

{ 
    transclude: true, 
    link: return function(scope, elm, attrs, ctrl, transclude) { 

    } 
} 

,但如果同時設置鏈接功能被忽略。

它的這種反模式? 沒有它沒有。因爲您可以在鏈接執行之前進行元素轉換。

Burn

相關問題