Глубокое копирование объектов в угловой?


интересно, есть ли возможность избежать копирования ссылок на объекты, когда вам нужно создать простой объект, который имеет массив встроенных объектов.Ситуация выглядит следующим образом: у меня есть сервер, который принимает JSON и применяет некоторую логику, а затем сохраняет объект в БД. допустим, моя форма предназначена для сохранения команд в БД. Сервер принимает команду как json. команда имеет массив объектов TeamMember, моя форма имеет простое поле для ввода информации о члене команды и добавления его в массив Team teamMembers. Теперь вот проблема, когда я добавляю члена команды в список массивов и хочу добавить другого члена команды, когда я ввожу в поле добавленный член также изменяется !. Я знаю причину

$scope.addTeamMember=function(teamMember){
   $scope.team.teamMembers.push(teamMember);
}

и это потому, что я помещаю одну и ту же ссылку в массив teamMembers, поэтому у меня есть один и тот же объект, добавленный несколько раз. чтобы избежать этого, я должен создать новый объект члена команды, скопировать все свойства teamMember и добавить его в массив.

 $scope.addTeamMember=function(teamMember){
       var newTeamMember; /*<--- copy teamMember */
       $scope.team.teamMembers.push(newTeamMember); /*and add newTeamMember*/
    }
3 51

3 ответа:

Ваш вопрос говорит, что вы хотите "избежать глубокого копирования", но я не уверен, что это точный. Похоже, вы просто хотите использовать угловое.копировать, потому что вам нужно создать копию члена команды и добавить ее в массив:

$scope.addTeamMember = function(teamMember) {
   var newTeamMember = angular.copy(teamMember);
   $scope.team.teamMembers.push(newTeamMember);
};

Это самая лучшая документация

https://docs.angularjs.org/api/ng/function/angular.copy

есть живой пример, а на странице, которая является само иллюстративным.

Я лично использую этот:

    function copyObjToObj(source, destination) {
        if(!angular.equals(source,destination)){
            if (!!destination) 
                angular.copy(source, destination);
            else 
                destination = angular.copy(source);
        }
        return destination;
    }
var destination = copyObjToObj(sourceObj, destination);