可以递归调用指令的 link 函数吗?
Is it ok to recursively call a directive's link function?
这是我的指令的简化版本。如果我想做这样的事情——本质上是用修改后的范围变量重新初始化指令——这样可以吗?请注意,在 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",我的意思是:
- 没有意外的副作用?
- 被认为是好的风格?
- 等等
如果不是,推荐的替代方案是什么?
这不行。事实上,每次调用它时你都会增加观察者的数量(例如 $observe
)并且很可能面临内存泄漏。
你到底想解决什么问题?如果您想根据范围变化刷新指令元素,很可能需要添加观察者 (scope.$watch
),但无需再次调用整个函数。
这是我的指令的简化版本。如果我想做这样的事情——本质上是用修改后的范围变量重新初始化指令——这样可以吗?请注意,在 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",我的意思是:
- 没有意外的副作用?
- 被认为是好的风格?
- 等等
如果不是,推荐的替代方案是什么?
这不行。事实上,每次调用它时你都会增加观察者的数量(例如 $observe
)并且很可能面临内存泄漏。
你到底想解决什么问题?如果您想根据范围变化刷新指令元素,很可能需要添加观察者 (scope.$watch
),但无需再次调用整个函数。