我在ng-repeat上有1300个观察者,我必须减少它。 最大的问题是我的ng-repeat中的很多东西都是双向绑定,因为我需要更改列表并每隔x次将新事件插入列表并处理di中的功能
许多观察者的Plunker示例以及应用程序的工作方式
https://plnkr.co/edit/rVIqaKbcnhAkvaeqcLA1?p=preview
我的应用程序如下:
通过每3秒轮询来从服务器获取事件Obj:
在我的控制器中我得到了数据:
vm.eventData = Server.eventData;
index html:
<event-list
settings-data ="vm.settings"
event-data = "vm.eventData"
</event-list>
事件列表指令:(当列表中有新的obj并在加载时显示列表时处理,当有新事件时由watchcollection更新并更新scope.eventData
scope.$watchCollection('eventData', function(newVal, oldVal){
}
event-data-directive.html
<li id="listItem_{{event.id}}" ng-repeat="event in eventsData track by $index">
在li里面,我有一个click指令来处理点击并显示事件,点击后,我需要用来自eventsData数组的数据更新视图
我尝试添加bindonce插件,但它没有帮助,因为它的单向绑定和我的应用中的每个操作都会影响事件列表
所以基本上我必须减少观察者或改变我的所有功能,你觉得怎么样?
感谢
答案 0 :(得分:0)
如果元素列表很长(我假设基于许多观察者),我建议你看一下所谓的虚拟滚动/虚拟ng-repeat。
它基本上做的是它只渲染浏览器视口中可见的元素。这实际上具有仅为可见内容添加观察者的结果。每当用户将更多元素滚动到视图中时,虚拟滚动组件将无缝地呈现新元素,并销毁移出视图的元素。因此,无论列表中的元素数量如何,都要保持观察者的数量不变。
自己开始工作可能会很棘手,因此我建议您查看angular-vs-repeat之类的模块,或者,如果您已经使用了在某些组件中实现虚拟滚动的框架,请在其中启用它。