可以递归调用指令的链接函数吗?

时间:2015-04-02 18:09:05

标签: angularjs angularjs-directive

Fiddle here.

这是我所拥有的指令的简化版本。如果我想做这样的事情 - 基本上用修改后的范围变量重新初始化指令 - 这样可以吗?请注意,在addSquare函数中,我再次调用link()。

myApp.directive('myDirective', function () {
var ddo = {
    restrict: 'E',
    replace: false,
    scope: {
        'numSquares': '@',
    },
    link: function (scope, elem, attr) {
        console.log('link', scope.numSquares);

        scope.colors = [];


        attr.$observe('numSquares', function (newV, oldV) {
            for (var i = 0; i < scope.numSquares; i++) {
                var t1 = Math.random();
                var t2 = t1 * 0xFFFFFF << 0;
                var t3 = t2.toString(16);
                //var randomHex = (Math.random() * 0xFFFFFF << 0).toString(16);
                console.log('push', t3);
                scope.colors.push('#' + t3);
            }
        });


        scope.addSquare = function () {
            scope.numSquares++;
            ddo.link(scope, elem, attr);
        }



    },
    template: '<div><input type="button" value="add square" ng-click="addSquare()"/><br><br><div ng-repeat="c in colors" class="square" style="background-color: {{c}}">aaa</div></div>'
};

return ddo;

});

通过&#34; ok&#34;,我的意思是:

  • 没有意外的副作用?
  • 被认为是好风格?

如果没有,建议的替代方案是什么?

1 个答案:

答案 0 :(得分:1)

这不行。实际上,每次调用时你都会增加观察者的数量(例如$observe),并且很可能会面临内存泄漏。

你准备解决什么问题?最有可能的是,如果要根据范围更改刷新指令元素,则需要添加观察者(scope.$watch),但不需要再次调用整个函数。