2015-04-02 38 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

相關問題