从一个循环(在指令中)生成观察者不起作用

问题描述:

基本上我有一个问题,我有一个指令,它具有可变数目的属性(基于某种模式),而且我有根据这些属性(以及有多少)来生成观察者。这些属性还与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"> 

任何帮助,将不胜感激

谢谢!

+1

你的意图是什么,因为,在我看来,你正在关注所有的范围,也许你想'观察'属性值!? – sbaaaang

+0

嗨,感谢您的回复!当任何一个属性发生变化(它们与控制器中的ng-models链接,其值将在用户输入中改变时)时,意图是在指令中触发一个事件。 正如我前面提到的,当我知道我需要多少属性时,这通常不是问题,但是此指令应该是可重用的,并且能够处理任意数量的属性(当然,使用正确的格式),因此看来,我需要动态生成观察者。 – LargeCrimsonFish

+1

那么你可以很容易地做一个循环,并绑定一个$观察每个属性的'attrs'我下注... :) – sbaaaang

您可以循环的ATTRS,并设置一个观察到的每个这样的:

angular.forEach(attr.$attr, function (key, value) { 
    attr.$observe(value, function (newValue) { 
     if (newValue) { 
     console.log('New value for attr.' + value + ':', newValue); 
     } 
    }); 
    }); 

如果你的目的是观看一组属性。