2016-05-12 7 views
0

Grundsätzlich habe ich ein Problem, wo ich eine Direktive, die eine variable Anzahl von Attributen hat, die es beobachtet (basierend auf einem bestimmten Muster), und ich habe um Beobachter basierend auf diesen Attributen zu generieren (und wie viele es gibt). Diese Attribute sind zusätzlich an ng-Modelle gebunden (wenn also der Attributwert sich ändert, werden die Beobachter gefeuert). Das Problem ist, die einzige Art, wie ich Beobachter dynamisch generieren kann, ist durch eine Art von Schleife, und es scheint, dass die Beobachter nicht funktionieren, wenn ich sie durch eine Schleife mache. Um zu bestätigen, dass es funktioniert, wenn ich jeden erklären, ich diese Prüfrichtlinie gemacht:Generieren Beobachter aus einer Schleife (in einer Richtlinie) funktioniert nicht

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

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

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

    // I try to generate the watchers here 

    } 
}]) 

Also im Grunde, wenn ich diesen Code verwenden, funktioniert es:

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

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

Aber wenn ich diesen Code verwenden, es tut es nicht.

for (var n = 0; n < keys.length; n++) { 

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

Dies ist, was die html wie

<input custom-directive 
attribute1 = "someNgModel" 
attribute2 = "otherNgModel"> 

Jede Hilfe wäre sehr geschätzt

Dank aussehen würde!

+1

Was ist deine Absicht, weil es scheint, dass du den ganzen Spielraum für nichts beobachtest, vielleicht willst du die Attributwerte $ beobachten '? – sbaaaang

+0

Hallo Danke für die Antwort! Die Absicht wäre, ein Ereignis in der Direktive auszulösen, sobald sich eines der Attribute ändert (sie sind mit ng-Modellen im Controller verknüpft, deren Werte sich bei Benutzereingaben ändern). Wie ich bereits erwähnt habe, ist dies normalerweise kein Problem, wenn ich weiß, wie viele Attribute ich will, aber diese Direktive soll wiederverwendbar sein und daher mit einer beliebigen Anzahl von Attributen umgehen können (natürlich mit dem richtigen Format) Ich muss die Beobachter dynamisch generieren, so scheint es. – LargeCrimsonFish

+1

Nun, Sie können leicht eine Schleife machen und binden ein $ beobachten für jedes Attribut, das innerhalb 'attrs' ist ich wette ... :) – sbaaaang

Antwort

1

Sie können Schleife die attrs und stellen eine beobachtbare für jeden so:

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

Wenn Ihre Absicht ist es, eine Gruppe von Attributen zu beobachten.

Verwandte Themen