如何在使用隔离作用域的angular指令中提高双向绑定的性能

How to increase performance in two way binding in angular directive using isolated scope?

本文关键字:高双 性能 绑定 指令 angular 隔离 作用域      更新时间:2023-09-26

我有一个指令'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>