如何在使用隔离作用域的angular指令中提高双向绑定的性能
How to increase performance in two way binding in angular directive using isolated scope?
我有一个指令'sim-grab',它将为自定义事件'pointOver'添加事件处理程序&'pointOut'在一组信息贴片上。当这些事件被触发时,我需要在信息块的顶部显示一个可视化。
使用ng-repeat填充信息块。我面临的问题是,在这些可视化显示中有一个小延迟(略高于700ms)。请注意,'pointOver/Out'事件可以在一秒钟内触发多次。
如果我在下面的代码中采取了错误的方法,如果有人能告诉我,那就太好了。
指令:
.directive('simGrab', function(){
return {
restrict: 'A',
scope : {
data : "="
},
link: function(scope, element, attrs)
{
var _pointOverEvents = 'pointOver';
var _pointOutEvents = 'pointOut';
var initialize = function () {
toggleListeners(true);
};
var onPointOver = function(evt) {
if(scope.data) {
if(evt) {
//turn on grab visualization
scope.data.isGrabbable = true;
}
//turn on point visualization
scope.data.isPointed = true;
}
};
var onPointOut = function(evt) {
if(scope.data) {
//turn off grab visualization
scope.data.isPointed = false;
scope.data.isGrabbable = false;
}
};
var toggleListeners = function (enable) {
// remove listeners
if (!enable){
console.log("simGrab destroyed");
return;
}
// add listeners.
element.on(_pointOverEvents, onPointOver);
element.on(_pointOutEvents,onPointOut);
scope.$on('$destroy', onDestroy);
};
var onDestroy = function (enable) {
toggleListeners(false);
};
initialize();
}
};
});
和HTML
<div class = "feed-box normal" ng-repeat="feed in normEntries" >
<div class="feed-element normal" ng-class="'color'+($index+1)" ng-click="setCurrFeed(feed)" sim-grab data="feed">
<div class="feed-title normal">{{feed.title}}</div>
<div class="time-ago">{{feed.date}}</div>
<p ng-bind-html="feed.summary"></p>
</div>
<div class="tip-container-centered" ng-show="feed.isPointed">
<div class='open-bar'>
<div class='open-bar-text'>OPEN</div>
<div class='open-bar-bg'>
<span class="text">OPEN</span>
<span class='open-sphere'></span>
</div>
</div>
</div>
<div class="tip-container-bottom-right" ng-show="feed.isGrabbable">
<div class="gesture grab" >GRAB</div>
</div>
重复大量Angular绑定的问题在于,每个绑定都存在一个监视器。如果绑定太多,页面就会变慢。如果你使用Angular 1.3+,你可以使用{{::feed.title}}。"::"是一次性绑定,您应该尽可能地使用它来减少观察者的数量。如果你使用较低角度的版本,你可以使用https://github.com/tadeuszwojcik/angular-once。你应该总是绑定那些不会改变的东西。
你可以使用chrome插件https://chrome.google.com/webstore/detail/angular-watchers/nlmjblobloedpmkmmckeehnbfalnjnjk来获得当前观察者的计数。
也可以在ng-repeat中使用"track by"符号来减少。
例如,如果提要。标题不变,像这样做:
<div class="feed-title normal">{{::feed.title}}</div>
相关文章:
- 从桌面读取python文件时高亮显示代码
- 函数参数中的数据与指定变量之间的任何性能差异
- 提高JQuery的性能
- 使用类从一个标记中双击事件
- 高亮显示时编辑文本大小和颜色
- 更改高贴图的缩放级别
- Angularjs-utils高亮过滤器在搜索时破坏应用程序
- 性能问题高图表图和 socket.io
- WebGL和Chrome:高分辨率会导致糟糕的性能
- 在节点 js 中编写命名函数的性能是否更高
- Mootools Selectors $ 或 $$.哪个性能更高
- C++和节点.js涉及高 I/O 时的性能
- JavaScript双等号(==)和三重等号(===)的性能差异
- 高图:组合双轴与下钻
- 删除性能成本高的函数
- 子组合器与级联:哪个性能更好,效率更高
- 哪种将 javascript 事件与 jquery 绑定的方法性能更高
- 哪个性能更高,<视频>或<画布>嵌入了视频
- 为什么这段代码性能不高?更新内部文本vs替换整个标签
- 如何在高图中同时缩放双x轴