2016-05-12 15 views
0

基本的には、(特定のパターンに基づいて)監視する属性の可変数を持つディレクティブを持つ問題があります。これらの属性に基づいてウォッチャーを生成します(およびその数もあります)。これらの属性は、さらにng-modelsに結び付けられます(属性値が変更されると、ウォッチャーが起動します)。問題は、ウォッチャーを動的に生成する方法がわかっている唯一の方法は、ある種のループを使用することであり、ループを通してそれらを実行するとウォッチャーが機能しないようです。私はそれぞれを宣言するとき、それが動作することを確認するために、私はこのテストディレクティブを作った:私はこのコードを使用している場合、(指示文の)ループからウォッチャーを生成できません

scope.$watch(function() { 
    return scope.$eval(attrs[keys[0]]);}, 
    function() {someFunction();}); 

scope.$watch(function() { 
    return scope.$eval(attrs[keys[1]]);}, 
    function() {someFunction();}); 

しかし:私はこのコードを使用している場合

.directive('customDirective', 
    ['$filter', function($filter) { 

    var link = function(scope, element, attrs, ngModelCtrl) { 

    var keys = ['attribute1', 'attribute2'] 

    // I try to generate the watchers here 

    } 
}]) 

だから基本的には、それが動作しますそれはしません。

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

お返事ありがとうございます!その意図は、属性のANYが変更されるたびに指令のイベントを起動することです(ユーザーの入力に応じて値が変更されるコントローラーのngモデルにリンクされます)。 前述のように、これは通常、いくつの属性が必要かを知っているときは問題にはなりませんが、このディレクティブは再利用可能であり、任意の数の属性(もちろん正しい形式)を扱うことができます。ウォッチャーを動的に生成する必要があります。 – LargeCrimsonFish

+1

あなたは簡単にループを作り、 'attrs'の中にある各属性の$ observeを束縛することができます: – 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); 
     } 
    }); 
    }); 

関連する問題