Я делаю простое веб-приложение, которое позволяет пользователям выбирать продукты и настраивать их заказ (напитки, гарниры и начинки). Подход, который я использую, заключается в том, чтобы каждый продукт питания имел следующие атрибуты:
var food = {
id:0,
name:"Burger",
drinks: [],
sides: [],
toppings: []
}
Я беру весь массив напитков [obj1, obj2..] и копирую их в новую переменную внутри области действия моего контроллера.. затем изменяю их атрибут количества. После отправки формы объект еды с его новым массивом напитков будет сохранен в другом массиве (корзине) внутри фабрики ShoppingCart. Да, это означает, что объект еды получит массив напитков с количеством напитков, равным 0.
angular.module('webMenu')
.controller('foodCtrl', ['$scope', 'SideFoods', 'ShoppingCart', 'FoodOrder', function($scope, SideFoods, ShoppingCart, FoodOrder){
$scope.food = FoodOrder.get();
$scope.all_drinks = SideFoods.get_drinks(); //grabs all drinks from drinks factory
$scope.drinks = $scope.all_drinks.slice(); // copies array into $scope variable which is connected to ng-repeat and ng-model
$scope.submitOrder = function(){ // copies the modified drinks to food.drinks
$scope.food.drinks = $scope.drinks;
ShoppingCart.add($scope.food); // shopping cart receives food
};
}]);
Все это работает, пока я не попытаюсь добавить еще один продукт в свою корзину. Изменение количества напитка для любого продукта питания изменит количество для всех остальных (внутри корзины). Я подозреваю, что это связано с тем, как я использую ng-repeat и ng-model.
<div id='drinks' ng-repeat='drink in drinks track by $index'>
<div class='drink'>
<!-- Using ng-model on drink.quantity fails to use a unique array -->
<input type='number' ng-model='drink.quantity'>{{drink.name}} x{{drink.quantity}}
</div>
</div>
Должно быть, что-то не так с моей логикой. Я знаю, что копирование всего массива напитков излишне и может быть выполнено лучше, но прежде чем приступить к этому, я хочу выяснить, что не так с моим текущим кодом. Я снова начал с нуля, но столкнулся с той же проблемой. Может кто-нибудь мне помочь?? :)
angular.copy() function
для копирования любого объекта. Не используйте срез или простое назначение, потому что в этих случаях будет назначена только ссылка. - person Ashot   schedule 28.11.2015