Почему Angular не связывает данные при копировании объекта из другого объекта?

Мы создали простой jsfiddle, чтобы проиллюстрировать мой вопрос:

играть на скрипке

Html:

   
    
        <span ng-click="overwrite(p)">{{ p.id }}: {{ p.name }}</span>
    

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

Как вы можете видеть, когда я устанавливаю свойства вручную, значения связываются. Но когда я перезаписываю объект, ничего не происходит. Как это возможно? И что мне делать, когда я хочу восстановить объект в нем?исходное состояние?

Представьте, что я создаю объект резервного копирования, используяvar productBackup = angular.copy(product), Затем я делаю изменения в исходном продукте, а затем решаю отменить свои изменения. Я хочу сделать это с помощьюproduct = productBackup, Но это нет работа! В этом случае мне нужно установить все свойства вручную, как это?

product.id = productBackup.id;
product.name = productBackup.name;
etc...
 Ajay Beniwal12 июн. 2013 г., 14:26
вы также можете использовать angular.extend, если вы хотите мелкую копию вместо глубокой копии

Ответы на вопрос(2)

Решение Вопроса

Если вы используетеangular.copy(source, destination) Вы можете достичь желаемого эффекта.

обновленная скрипка

То, что происходит, это то, что угловой все еще смотрит оригиналp ссылка даже после того, как вы делаете назначение. Если вы используетеangular.copy() вы копируете значения изprod вp какой угловой смотрит правильно.

Я спросиланалогичный вопрос но он решал эту проблему в общем сервисе.

 Martijn12 июн. 2013 г., 14:07
В заключение! Я пытаюсь заставить это работать часами! Итак, проблема была связана с тем, что Angular смотрит ...

Я никогда не работал с AngularJS раньше, но я думаю, что здесь происходит, что ваш параметрp это не простой объект ключ / значение, а более сложный объект AngularJS. Назначая свойprod к нему вы переопределяете его, а не меняете определенные части объекта.

Может быть, следующий фрагмент кода поможет вам:

for(var key in prod) {
    p[key] = prod[key];
}
 Martijn12 июн. 2013 г., 14:09
Спасибо за ваш ответ и, к вашему сведению, это сработало, но я предпочитаю делать это по-английски :), как предложил Марк.

Ваш ответ на вопрос