2015-11-08 11 views
6

Bene, ho un problema qui. Ho una ng-repeat all'interno della quale è presente un input con ng-change(). Questa è una parte del modello direttiva e il doppio modo associato a un oggetto padre. Se scrivo qualcosa nella casella di input, tutto funziona correttamente e l'oggetto principale viene aggiornato. Tuttavia, quando devo sostituire l'oggetto genitore dal controller della direttiva, devo affrontare un problema.Funzione ng-change chiamata più volte dall'ingresso all'interno di ng-repeat

Il problema è che, una volta sostituito l'oggetto padre, la vista è associata a nuovi valori (sostituiti). Anche in quel momento la stessa funzione (come in ng-change()) viene attivata manualmente per alcuni calcoli.

Tuttavia, ho notato che la stessa funzione viene nuovamente richiamata (non so come). La cosa importante è che il modello ng di input non è definito, quando vengono chiamati automaticamente. Di conseguenza, finalmente l'oggetto genitore contiene un valore non definito.

Sono ancora confuso, perché il ng-change viene chiamato, dopo che il metodo del controller chiama. È necessario fare qualcosa con gli ambiti figlio creati da ng-repeat.

Ho già utilizzato la traccia per $ indice. e ho binded modelli di parentObj.something.something [indice $]

Qualsiasi aiuto su sopra è apprezzato ...

ho

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

template Main:

<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:: Modello di direttiva

<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> 

Nel controllore della direttiva:

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

dal regolatore della direttiva, sto cercando di chiamare un API e aggiornare destinazione dati come:

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} 
    } 

In questo modo si chiama il dirrective e aggiorna la visualizzazione sullo schermo con nuovi valori da APIResponse. Dato che la vista direttiva è controllata usando ng-show, i nuovi valori rimangono intatti nella vista. Questa funzione è chiamata una volta in controller per chiamata direttiva con primo argomento come -1. Ma dopo di ciò viene eseguito di nuovo con il primo valore come "non definito". Con undefined, viene eseguito tutte le volte che viene compilata la direttiva. Di conseguenza lo target.targets.years [1] .values.data [$ index] diventa indefinito.

Qualche idea che sta andando storto? Mi sono grattato la testa per ore.

+0

potresti aggiungere del codice ..? per avere più idea di cosa sta succedendo .. –

+0

@PankajParkar Per favore, guarda di nuovo. Portami con me nel caso, la lingua non è chiara. –

+0

puoi fornire campioni di dati con dati di esempio? – Grundy

risposta

7

Ho approfondito il problema e ho scoperto che nel mio caso avevo un directive inserito nel tag input, che stava analizzando il modello dopo che è stato associato. (Fondamentalmente era usato per qualche tipo di arrotondamento. Quindi ho rimosso quella logica e ho iniziato a passare cifre arrotondate dal server. Il problema ha smesso di apparire). Quindi la mia conclusione è stata che il secondo ng-change è stato attivato perché il modello è stato nuovamente modificato dalla direttiva. Chiunque affronti tali problemi dovrebbe cercare qualsiasi altro tipo di modifica al modello dopo l'associazione iniziale.

Pubblicare questo come risposta, poiché questa era la soluzione nel mio caso.

Problemi correlati