首頁  >  問答  >  主體

angular.js - directive裡的link和controller區別?非directive的scope能否用link?

為什麼有的要寫在link裡面,有的要寫在controller裡面? !
如果希望在module中設定一個子scope,但不用directive,這時候能否用link?
(比如說用ngRoute時候的ng-view部分,可否用link)
controller可以跟伺服器端通訊是吧,link好像不幹這事情?還是只是我沒見過?

PHP中文网PHP中文网2714 天前658

全部回覆(2)我來回復

  • 高洛峰

    高洛峰2017-05-15 16:53:39

    關於directive裡的link和controller區別?
    1.執行順序:先controller後link
    2.何時使用controller:一般場景下都不想要使用controller,只需要把邏輯寫在link中就可以了;用controller的場景就是該指令(假設為a)會被其他指令(假設為b)require的時候,這樣就會在b指令的link函數中傳入這個controller(如果require多個的話,傳入的是一個數組,數組中存放的是每一個require的指令對應的controller),目的很顯然是為了指令間進行交流的。

    關於非directive的scope能否用link?
    在指令中才存在呼叫link的時候,也就是說link是該指令在compile之後和scope進行綁定的時候呼叫的。
    那隻有在指令定義的那個地方用到link了,其他地方也可以用,例如做彈出框的時候就需要,拿到模板tpl,然後調用var linkFn = $compile(angular.element(tpl));此时返回的就是一个link的函数,然后linkFn(scope),這裡的scope是你需要指定的scope,可以是新創建的,也可以是已經存在的。

    回覆
    0
  • 某草草

    某草草2017-05-15 16:53:39

    link 和 controller 是完全不相干的概念。

    對於一個特定的drective, controller可以是沒有的, link比較複雜,基本上可以看做是$compile的一個回調angularjs 對於drictive 必須是首先編譯---> 調用$compile生成dom對象---> 調用link綁定到對應scope ---> 觸發$digest (之後還有好多步驟,才能更新一個driective, 不同物件的編譯次數和時機都不一樣,具體去看api)

    總之compile, link 之類都是針對driective來說的,如果題主對jquery熟的話,那麼compile過程就相當於創建一些dom對象( $('

    那麼scope是啥? scope是綁定模型用的。
    controller是啥? 給scope 加上方法(邏輯)用的。

    link 是用來把directive嵌入dom的angularjs提供的一個切面機制, controller 是 scope中watch的事件被觸發時的context, 完全不同的東西。

    針對最後一個問題, 只要是可以運行的函數都能執行你寫的程式碼,但一般來說
    1) 把你的業務邏輯寫在controller裡, 而且不要寫在driective自己的controller裡, 而是在它綁定的scope的那個controller上

    2) controller裡面別出現dom操作,特別是prepend,append 這些, 因為未被編譯過的dom物件是沒法被watch的, angularjs不會監視那些後來加入又沒有被編譯過的dom物件。

    回覆
    0
  • 取消回覆