4

我寫下面的指令來調用一個函數,當ngRepeat元素在UI上呈現時。指令不能'需要:ngRepeat'

指令

directives.directive('repeatDone', function() { 
    return { 
     restrict: 'A', 
     require: 'ngRepeat', 
     link: function(scope, element, attrs, ngModel) { 
      if (scope.$last) { 
       scope.$eval(attrs.repeatDone); 
      } 
     } 
    }; 
}); 

但它給$compile錯誤。 如果我刪除需求部分,它工作正常。

爲什麼AngularJS不能接受「require:'ngRepeat'」? 幫助將不勝感激。

+1

什麼是錯誤? – 2015-02-07 19:29:19

+0

'require:'ngRepeat''這會導致編譯錯誤。 – stevenfrog 2015-02-08 04:46:47

回答

7

require用於訪問另一個指令的控制器。但ng-repeat沒有控制器。看看sourceng-repeat,字控制器甚至不出現在代碼中。 documentation也沒有提及ng-repeat的控制器。

通常,當您使用require時,這是因爲您想要調用所需控制器的功能。在你的指令的鏈接函數中,你添加了參數ngModel - 如果控制器存在,它將被填充。但是你絕對不要在代碼中使用這個ngModel參數。在這種情況下,您爲什麼需要使用require並不是很清楚。

編輯

在進一步審查,也許你想要求ng-repeat因爲你repeat-done指令將不是ng-repeat的範圍之外工作。如果這是原因,另一個解決方案可能是遍歷DOM,查看repeat-done指令的父元素,看看它們是否具有'ng-repeat'屬性。如果沒有找到,您的指令可能會引發錯誤。但是,這似乎有更多的代碼W /很少的投資回報...

+1

很好的答案。 我認爲「要求」的面部含義讓我感到困惑。 **指令中的「require」意味着需要控制器或ngModel用於下一步,而不是此指令必須使用與某事有關的**。 – stevenfrog 2015-02-08 04:45:33

2

您應該在評估範圍之前$timeout。因爲當你在超時時間內編寫代碼時,$timeout將在當前摘要週期完成後正好運行。

或者你可以使用scope.$evalAsync代替scope.$eval

$超時這隱式調用$適用()的延遲& $應用運行$消化週期 調用瀏覽器的

DOM redered元素後正好經過

$ evalAsync維護異步隊列,並在摘要循環後調用 在瀏覽器上DOM重新排序元素之前調用

CODE

directives.directive('repeatDone', function($timeout) { 
    return { 
     restrict: 'A', 
     link: function(scope, element, attrs, ngModel) { 
      if (scope.$last) { 
       $timeout(function() { 
        scope.$eval(attrs.repeatDone); 
       }); 
       //or you can use 
       //scope.$evalAsync(attrs.repeatDone); 
      } 
     } 
    }; 
}); 

感謝。

+0

你的方法更好。 和thx爲您解釋。 – stevenfrog 2015-02-08 04:41:55