我的JavaScript /角碼的表現與我期望的相反,我無法弄清楚爲什麼。我有一個角服務定義兩種方法用於獲取和設置 爲什麼推送對象到數組覆蓋/更新現有的和類似的對象?
app.factory('orderItems',['Restangular','$mdDialog',function(Restangular,$mdDialog){
var orderItems = [];
return{
getOrderItems: function(){
return orderItems
},
setOrderItems: function(item,fillings){
...
orderItems.push(item)
...
}, ...
項目使用ng-click
組項目
product_template.html
<div >
<md-button class="md-raised" ng-click="showAddons($event,product)">Add to Cart</md-button>
</div>
controller
app.controller('productCtrl',['$scope','getProducts','orderItems','Restangular','$mdDialog',function($scope,getProducts,orderItems,Restangular,$mdDialog){
//$scope.products;
$scope.products = getProducts(Restangular);
// Dialog
$scope.showAddons=function(ev,product){
$mdDialog.show({
locals:{current_Product: product,},
//inline controller
controller:['$scope','current_Product','orderItems',function($scope,current_Product,orderItems){
$scope.product = current_Product;
$scope.addons = {
checked:[],}
...
}],
templateUrl: 'dialog.html',
targetEvent: ev,
})
}
}])
dialog.html
<md-list-item ng-repeat="addon in product.productAddons">
...
<md-checkbox class="md-secondary" checklist-model="addons.checked" checklist-value="addon"></md-checkbox>
</md-list-item>
<md-button class="md-raised" style="background-color:#f44336; color:#fff" ng-click="setOrderItems(product,addons.checked)">Done</md-button>
當setOrderItems
傳遞類似物體不止一次,就會出現問題。第一次,orderItems.push按預期工作,然後當一個類似的產品被傳遞給'setOrderItems'時,它被推送到'orderItems',但是'orderItems'中的所有項目被更新爲這個當前設置的項目。
也就是說,如果orderItems
被[{name:"chicken burrito",fillings:[{name:"cabbage"},{name:"cheese"}],...}]
之前,設置一個類似的項目後,但差異餡料,orderItems
更新爲[{name:"chicken burrito",filling:[{name:"guac"}],...},{name:"chicken burrito",filling:[{name:"guac"}],...}]
。如果setOrderItems
通過不同的產品說[{name:"goat burrito",...}]
它按預期添加。
不能碰巧發現一個類似的問題。我究竟做錯了什麼。我希望能夠添加類似的物品,但不同的餡料到orderItems
。
顯而易見的答案是,你不推動* new *對象,你將* same *對象推入數組兩次。你可能需要做的是,在將一個對象推入數組之後,創建一個* new *對象來替換它在當前作用域中。 –
@Matt,你認爲可以在一個完整的答案中解釋自己,我的JavaScript不好。如果不麻煩,我會很感激一個很好的解釋。 –