2013-06-12 6 views
7

ho creato un semplice jsfiddle per illustrare la mia domanda:Perché Angular non esegue il databind dei dati quando un oggetto viene copiato da un altro oggetto?

fiddle

Html:

<div ng-controller="MyCtrl"> 
    <div ng-repeat="p in products"> 
     <span ng-click="overwrite(p)">{{ p.id }}: {{ p.name }}</span> 
    </div> 
</div> 

Javascript:

var myApp = angular.module('myApp',[]); 

function MyCtrl($scope) { 

    var products = [{id:1, name:'first'}, {id:2, name:'second'}]; 
    $scope.products = products; 

    var prod = {id: 3, name:'third'}; 

    $scope.overwrite = function(p){ 
     p.id = 4; 
     p.name = 'forth'; 

     p = prod; // this doesn't work nor does angular.copy(prod) 
    } 
} 

Come si può vedere, quando ho impostato il proprietà a mano, i valori sono legati. Ma quando sovrascrivo un oggetto, non succede nulla. Com'è possibile? E cosa devo fare quando voglio ripristinare un oggetto nel suo stato originale?

Immaginare di creare un oggetto di backup utilizzando var productBackup = angular.copy(product). Quindi apporto le modifiche al prodotto originale e successivamente decido di annullare le mie modifiche. Voglio farlo usando product = productBackup. Ma questo non funziona! In questo caso, ho bisogno di impostare tutte le proprietà a mano in questo modo?

product.id = productBackup.id; 
product.name = productBackup.name; 
etc... 
+0

puoi anche usare angular.extend se vuoi una copia superficiale invece di una copia profonda –

risposta

22

Se si utilizza angular.copy(source, destination) si è in grado di ottenere l'effetto desiered.

updated fiddle

Quello che sta accadendo è che angolare è ancora guardando l'originale p di riferimento anche dopo che fate l'assegnazione. Se si utilizza angular.copy(), si stanno copiando i valori da prod a p che angolare sta guardando correttamente.

Ho chiesto un similar question ma ha affrontato questo problema in un servizio condiviso.

+1

Finalmente! Sto cercando di farlo funzionare per ore! Quindi, il problema ha a che fare con quale riferimento Angular sta guardando ... – Martijn

3

Non ho mai lavorato con AngularJS prima, ma penso che quello che sta succedendo qui è che il vostro parametro p non è il vostro oggetto semplice chiave/valore, ma una più complessa AngularJS oggetto. Assegnando il tuo prod ad esso, lo stai sovrascrivendo invece di modificare parti specifiche dell'oggetto.

Forse il seguente frammento di codice vi aiuterà fuori:

for(var key in prod) { 
    p[key] = prod[key]; 
} 
+0

Grazie per la tua risposta e per FYI questo ha funzionato, ma preferisco farlo in modo angolare :), come suggerito da Mark. – Martijn

Problemi correlati