AngularJS создает новую область из области видимости
Я не очень понимаю, почему этот кусок кода работает так, как он работает.
Я звоню в мою службу и получаю ожидаемые данные. Я хочу хранить картинки отдельно, так как мне нужно изменить массив и разобрать его по-разному для новых областей. Вещь, которую я не понимаю, состоит в том, что, поскольку я сейчас создал 2 области видимости, product и productPictures - почему они все еще связаны?
Если я использую Lodash для _.sort() productPictures, тогда объект Images внутри scope.Product также будет изменен, однако я не хочу, чтобы это произошло, и я не знаю, как изолировать $ scope.productPictures. Я пытался обрабатывать области видимости как простые переменные js, такие как var product; и var productPictures, но, поскольку я устанавливаю их данные в соответствии с ответом службы, они все еще связаны.
$api.productpage.query({
id: parseInt($stateParams.productId)
}, function (data) {
$scope.product = data[0];
$scope.productPictures = data[0]['Images'];
});
Я пропускаю что-то супер тривиальное? Стоит ли мне управлять изображениями продуктов в отдельном запросе на обслуживание?
2 ответа
Объекты передаются по ссылке в javascript. Это означает, что в этом коде
$scope.product = data[0];
$scope.productPictures = data[0]['Images'];
$scope.productPictures
указывает на тот же объект (я думаю, это массив в вашем случае), как data[0].Images
,
Чтобы преодолеть эту проблему, вам нужно клонировать объект, а не просто ссылку. Вы можете проверить angular.copy
метод:
$scope.productPictures = angular.copy(data[0].Images);
Вы создаете две переменные в области видимости, а не две области видимости.
Объект передается по ссылке, поэтому, если вы измените один, он будет модифицировать другой. Может быть, попытаться клонировать объект
редактировать использовать angular.copy() вместо jquery.extend()
function myclone ( obj){
return jQuery.extend(true, {}, obj);
}