从一个循环(在指令中)生成观察者不起作用
问题描述:
基本上我有一个问题,我有一个指令,它具有可变数目的属性(基于某种模式),而且我有根据这些属性(以及有多少)来生成观察者。这些属性还与ng-models绑定(因此当属性值改变时,观察者被解雇)。问题是,我知道如何动态生成观察者的唯一方法是通过某种类型的循环,而且如果我通过一个循环执行它们,看起来似乎不会工作。为了证实它的工作原理,当我宣布每一个,我做了这个测试指令:从一个循环(在指令中)生成观察者不起作用
.directive('customDirective',
['$filter', function($filter) {
var link = function(scope, element, attrs, ngModelCtrl) {
var keys = ['attribute1', 'attribute2']
// I try to generate the watchers here
}
}])
所以基本上,如果我用这个代码,它的工作原理:
scope.$watch(function() {
return scope.$eval(attrs[keys[0]]);},
function() {someFunction();});
scope.$watch(function() {
return scope.$eval(attrs[keys[1]]);},
function() {someFunction();});
但是,如果我用这个代码,它没有。
for (var n = 0; n < keys.length; n++) {
scope.$watch(function() {
return scope.$eval(attrs[keys[n]]);},
function() {someFunction();});
}
}
这是HTML是什么样子
<input custom-directive
attribute1 = "someNgModel"
attribute2 = "otherNgModel">
任何帮助,将不胜感激
谢谢!
答
您可以循环的ATTRS,并设置一个观察到的每个这样的:
angular.forEach(attr.$attr, function (key, value) {
attr.$observe(value, function (newValue) {
if (newValue) {
console.log('New value for attr.' + value + ':', newValue);
}
});
});
如果你的目的是观看一组属性。
你的意图是什么,因为,在我看来,你正在关注所有的范围,也许你想'观察'属性值!? – sbaaaang
嗨,感谢您的回复!当任何一个属性发生变化(它们与控制器中的ng-models链接,其值将在用户输入中改变时)时,意图是在指令中触发一个事件。 正如我前面提到的,当我知道我需要多少属性时,这通常不是问题,但是此指令应该是可重用的,并且能够处理任意数量的属性(当然,使用正确的格式),因此看来,我需要动态生成观察者。 – LargeCrimsonFish
那么你可以很容易地做一个循环,并绑定一个$观察每个属性的'attrs'我下注... :) – sbaaaang