2

我正在使用AngularJS和ng-repeat。中繼器中的每個項目都是巨大的項目,其中包含許多ng-bind,並且列表中包含滾動條。我想編寫一個代碼,當物品不可見時(滾動條外)註銷每個ng-bind的手錶,並在物品可見時再次註冊手錶。
我有兩個問題:
1.這樣的代碼是否已經存在?
2. ng-bind創建一個手錶。我如何獲得手錶取消註冊($scope.$watch返回註銷方法,但這發生在ng-bind指令內)?當項目不可見時,在ng-bind中註銷觀察者

謝謝!

+0

您的意思是說您有一個視口,並且您只想要監視當前的視口元素? –

+0

@RoyiNamir:是的。 – Naor

回答

0

如果你確實想訪問元素上的ng-bind,你可以創建一個簡單的指令,傳遞給作用域。當你有一個範圍,你可以訪問手錶$$watchers。我做了一個小提示,表明here

link: function(scope, elt, attrs) { 
    console.log(scope.$$watchers); 
} 

至於你的滾動問題,你有幾個選項。我以前沒有用過,但似乎有一個plugin,對此我不會保證正確性。 inview指令背後的理論是,您將滾動監聽器附加到您的容器。滾動後,您可以計算哪些元素在視圖中。

在此之後,您可以爲那些被查看的人觸發一個inview功能,並觸發其他曾經被查看的人的outview(可以刪除監視者)。

如果您有任何疑問,請告知我。希望這可以幫助!

+0

$$觀察者不允許我註銷觀察者。我不想使用視圖而不是ng-bind。 – Naor

+0

您可以將腕錶從$$觀察者處剪掉,以免打開腕錶。保持拼接$監視並在觸發視圖時重新添加。你需要使用ng-bind和in-view。 – hassassin

+0

如果你仔細看看AngularJS註銷函數,它會:arrayRemove(array,watcher); lastDirtyWatch = null; arrayRemove()正在從$$觀察者中刪除觀察者,但lastDirtyWatch = null是什麼;做? – Naor

1

我正在使用angular-viewport-watch,它具有在可滾動容器中滾動的嵌套表格(具有多行)。

不得不解決一些問題(thisthis),但總體來說效果很好。當一個元素不在視口中時,其所有的手錶都會被刪除(遞歸),並且當它重新出現在視口上時,觀察者將被添加回來。

我使用annotate-watchers代碼片段(在Chrome上)可以輕鬆查看有多少個觀察者與每個DOM元素相關。