Глубокое копирование объектов в 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*/
}
Ответы
Ответ 1
В вашем вопросе говорится, что вы хотите "избежать глубокой копии", но я не уверен, что это точно. Похоже, вы просто хотите использовать angular.copy, потому что вам нужно создать копию члена команды и добавить ее в массив:
$scope.addTeamMember = function(teamMember) {
var newTeamMember = angular.copy(teamMember);
$scope.team.teamMembers.push(newTeamMember);
};
Ответ 2
Это лучшая доступная документация
https://docs.angularjs.org/api/ng/function/angular.copy
на странице есть живой пример, который сам иллюстрирует.
Ответ 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);