2014-02-20 36 views
2

我已經爲Angular創建了一個指令來知道ng重複何時完成。我發現最常見的解決方案就像是使用here - Calling a function when ng-repeat has finished在splice()元素完成時重複的角度指令

但是,爲什麼指令只是在添加元素時觸發,而不是在刪除時觸發?

Here - ng-repeat list in Angular is not updated when a model element is spliced from the model array我看到有關使$範圍的一些建議。$應用,但仍然沒有工作,因爲它說「$已經在進行中適用」

我創建 here - a Plunker在那裏你可以複製它。

非常感謝!

回答

4

將項目添加到集合時,指令起作用的原因在於,將每個重複元素添加到dom時都會調用鏈接函數。當集合首次被渲染並且一個項目被添加到集合的末尾時,這非常適用。當一個項目被添加到集合中的其他地方時它不起作用,例如在開始時,爲新元素調用鏈接函數,但$ last將爲false。

從集合中刪除某個項目時,不會創建任何指令,因此不會調用鏈接函數。

爲了得到你想要的,你可以創建在收集手錶,並執行任何你想要在$超時這樣做,它的渲染後做了什麼:

$scope.$watchCollection('ta', function(){ 
    $timeout(function(){ 
     // the collection has rendered so do all my whizzy stuff 
    }); 
}); 
0

很可能是因爲在項目拼接時ng-repeat不會遍歷整個數組。它只是從數組中刪除該項目並刪除相關的DOM節點。

我不知道你到底想要達到什麼目的,但是如果你需要對ng-repeat列表中的變化做出反應,爲什麼不只是$看數組呢?

+0

感謝@Harijs,我使用一個指令而不是$ watch,因爲$ watch在渲染之前觸發。當ng-repeat元素的渲染完成時,我需要調整元素的大小。 –

+0

那麼,如果你想避免初始觸發器,你可以設置你的$ watch功能,例如, ng文檔實際顯示它的方式(http://docs.angularjs.org/api/ng/type/$rootScope.Scope) '$ scope。$ watch('myvar',function(newValue,oldValue){ if(newValue!== oldValue){ // do your thing } });' –

+0

我不是說初始觸發器。我的意思是,當我做一個array.push()時,首先它會觸發手錶,然後呈現新元素(這是什麼意思)。但是當ng-repeat的所有元素都被渲染時,我需要調用我的resize()函數。 –