2016-05-12 36 views
0

基本上我有一個問題,我有一個指令,它具有可變數目的屬性(基於某種模式),而且我有根據這些屬性(以及有多少)來生成觀察者。這些屬性還與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

回答

1

您可以循環的ATTRS,並設置一個觀察到的每個這樣的:

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

如果你的目的是觀看一組屬性。