2015-04-02 41 views
0

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; 

});

通过 “OK”,我的意思是:

  • 免费的意想不到的副作用?
  • 认为好样式?

如果不是,有什么推荐的替代方案?

+0

你的例子中没有递归。此外绝对没有理由再次调用'link'。只需添加另一种颜色。 – zeroflagL 2015-04-02 18:55:15

回答

1

这并不好。实际上,每次调用观察者时(例如$observe),您都会乘以它,并且很可能会面临内存泄漏。

你试图准确解决什么问题?如果要根据作用域更改刷新指令元素,最有可能需要添加监视器(scope.$watch),但不需要再次调用整个函数。

+0

明白了,谢谢。我的示例在添加新盒子时只需要运行更多的初始化代码。使用几行代码很容易调用链接函数,但对于额外的观察者来说显然不值得。 – Jer 2015-04-02 19:51:18

+0

是的,只需在初始调用的'$ scope.reset'函数中添加所有的逻辑,然后在观察器触发时再次调用(这是典型的) – floribon 2015-04-02 21:23:15

相关问题