Подтвердить что ты не робот

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

Интересно, есть ли во избежание копирования ссылок на объекты, когда вам нужно создать простой объект с массивом встроенных объектов. Ситуация такова: у меня есть сервер, который принимает JSON и применяет некоторую логику, а затем сохраняет объект в БД. скажем, моя форма предназначена для сохранения команд в БД. Сервер принимает команду как json. команда имеет массив объектов TeamMember, у моей формы есть простое поле для ввода информации о члене члена команды и добавления ее в массив 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*/
    }
4b9b3361

Ответ 1

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

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

Ответ 3

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

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