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元素相关。