2015-11-08 12 views
6

Nun, ich habe ein Problem hier. Ich habe eine ng-Wiederholung, in der eine Eingabe mit ng-change() vorhanden ist. Dies ist ein Teil der Direktivenvorlage und des Doppelwegs, der an ein Elternobjekt gebunden ist. Wenn ich etwas in Eingabefeld eintippe, funktioniert alles gut und Elternobjekt wird aktualisiert. Wenn ich jedoch das übergeordnete Objekt vom Controller der Direktive ersetzen muss, stehe ich vor einem Problem.ng-change-Funktion mehrmals aufgerufen von Eingabe in ng-repeat

Das Problem ist, dass, sobald Elternobjekt ersetzt wird, die Ansicht mit neuen (ersetzten) Werten gebunden wird. Auch zu dieser Zeit wird die gleiche Funktion (wie in ng-change()) für einige Berechnungen manuell ausgelöst.

Allerdings habe ich festgestellt, dass die gleiche Funktion wieder aufgerufen wird (keine Ahnung wie). Wichtig ist, dass das ng-Modell der Eingabe nicht definiert ist, wenn sie automatisch aufgerufen werden. Als Ergebnis enthält das übergeordnete Objekt schließlich den Wert undefined.

Ich bin immer noch verwirrt, warum die ng-Änderung aufgerufen wird, nachdem die Controller-Methode ruft. Muß es etwas mit Child Scopes machen, die ng-repeat erzeugt.

Ich habe bereits Track von $ index verwendet. und ich habe binded Modelle parentObj.something.something [$ index]

Jede Hilfe zu oben geschätzt ...

Ich habe

module.directive('myDirective', function() { 
     return { 
      scope: { 
       target: '=', 
       }, 
      controller: 'DemoController', 
      templateUrl: 'app/demo/html/demo.html' 
} 
}); 

Hauptvorlage:

<li ng-repeat="l in group_Main.mains" 
<li ng-repeat="target in l.description.Value track by $index" 
<li ng-repeat="(key, groups) in target.group track by $index"> 
<div layout="row" layout-wrap myDirective target="group"></div> 
</li> 
</li> 
</li> 

app/demo/html/demo.html:: Vorlage der Richtlinie

<div class="table_FY_height" flex ng-repeat="m in months track by $index"> 
<input ng-change="changeIt(target.targets.years[1].values.data[$index], target, year,parent, $index)"" ng-if="$index>currentMonth" ng-model="target.targets.years[1].values.data[$index]"/> 
</div> 

in der Richtlinie des Controllers:

module.controller('DemoController', function($scope, $rootScope){ 
changeIt(-1,$scope.target,$scope.year,$scope.parent); 
} 

aus der Richtlinie des Controllers, Ich versuche, eine API aufrufen und Ziel Daten aktualisieren, wie:

http.get(url).then({ 
    function(APIResponse){ 
for(var i=0; i<12; i++){ 
    target.targets.years[1].values.data[i] = APIResponse.targets.years[1].values.data[i] 
}}, function(error){ 
    //error handling here} 
    } 

Dadurch wird die dirrective ruft und aktualisiert die Ansicht auf dem Bildschirm mit neuen Werten von APIResponse. Da die Anweisungsansicht mit ng-show gesteuert wird, bleiben die neuen Werte in der Ansicht erhalten. Diese Funktion wird einmal im Controller per Direktivenaufruf mit dem ersten Argument als -1 aufgerufen. Danach läuft es wieder mit dem ersten Wert als 'undefiniert'. Bei undefined läuft es so oft wie die Anweisung kompiliert wird. Folglich wird die target.targets.years [1] .values.data [$ index] undefiniert.

Irgendwelche Ideen was schief geht? Ich kratze mich seit Stunden mit dem Kopf darüber.

+0

könnten Sie etwas Code hinzufügen ..? um mehr darüber zu erfahren, was passiert .. –

+0

@PankajParkar Bitte schauen Sie noch einmal. Sei bei mir, die Sprache ist nicht klar. –

+0

können Sie Probe Plunkr mit Beispieldaten zur Verfügung stellen? – Grundy

Antwort

7

Ich tief in das Problem gegraben und festgestellt, dass in meinem Fall hatte ich eine directive auf input Tag platziert, die das Modell analysiert wurde, nachdem es gebunden ist. (Es wurde im Grunde für eine Art Rundung verwendet. Also entfernte ich diese Logik und begann, abgerundete Zahlen vom Server zu übergeben. Das Problem hörte auf zu erscheinen). Meine Schlussfolgerung war also, dass die zweite ng-change gefeuert wird, weil das Modell wieder von der Direktive geändert wird. Jeder, der sich mit solchen Problemen konfrontiert sieht, sollte nach der ersten Bindung nach einer anderen Änderung des Modells suchen.

Dies als die Antwort, wie dies die Lösung in meinem Fall war.

Verwandte Themen