2013-03-23 10 views
10

Si sta verificando uno strano problema in cui un input che utilizza ng-list non si aggiorna quando si aggiungono elementi al modello. Ho creato un violino per illustrare meglio il problema: http://jsfiddle.net/rtZY3/input ng-list che non si aggiorna quando si aggiungono elementi all'array

// Doesn't update ng-list input 
$scope.tags.push(tag); 

// Does update ng-list input 
var tags = angular.copy($scope.tags); 
tags.push(tag); 
$scope.tags = tags; 

Questo non sembra comportamento previsto, soprattutto perché $scope.tags viene adeguatamente aggiornato, come illustrato dal tag <pre> nel jsFiddle sopra.

+1

Se @Martin ha risolto il problema, è necessario contrassegnarlo come risposta. – Jess

risposta

15

Ok, quindi è stato interessante. Ho scavato nel codice sorgente AngularJS non ancora modificato per lo ngList directive.

Sembra che il primo esempio non attivi la funzione di formattazione, che è la funzione che divide i valori dell'array in una stringa separata da virgole che viene visualizzata nel campo di input.

Ulteriori indagini mostrano che l'errore si trova nella direttiva ngModel controller. I formattatori vengono invocati solo se il valore non è rigorosamente uguale al valore precedente, ma poiché si tratta della stessa istanza dell'array nel primo esempio, tale istruzione viene valutata come falso e quindi il campo di testo non viene aggiornato. See the source code.

$scope.$watch(function ngModelWatch() { 
    var value = ngModelGet($scope); 

    // $modelValue and value is the same array instance in your first example 
    if (ctrl.$modelValue !== value) { 
     // ... 
    } 
}); 

Nel secondo esempio viene creata una nuova istanza di array ogni volta e quindi vengono eseguiti i formattatori.

+1

Huh, questo è davvero interessante; grazie per averlo investigato! Immagino che rimarrò con il mio secondo esempio. –

Problemi correlati