2014-12-03 108 views
0

我會通過說明$scope.$apply()在我在addToOrder()內調用它時不起作用。我的控制檯輸出以下錯誤:

Error: [$rootScope:inprog] $apply already in progress 
http://errors.angularjs.org/1.2.25/$rootScope/inprog?p0=%24apply 

至於核心問題,當我試圖將其推入我的訂單陣列之前設置我item對象的數量,它總是返回未定義

.controller('MenuItemCtrl', ['$scope', '$state', '$stateParams', '$localstorage', 'MenuItem', 
function($scope, $state, $stateParams, $localstorage, MenuItem) { 
    MenuItem.get($stateParams.menuItemId) 
    .success(function(data) { 
     $scope.menuItem = data; 
    }); 
    $scope.addToOrder = function() { 
     var item = { 
      name: $scope.menuItem.name, 
      id: $scope.menuItem.objectId, 
      qty: $scope.quantity, 
      price: $scope.menuItem.price, 
      ttlPrice: ($scope.menuItem.price) 
     } 
     $localstorage.order.push(item); 
    } 
}); 

這裏是我的HTML:

<label class="item item-input col"> 
    <input type="number" ng-model="quantity" value="1"> 
</label> 
<div class="item col">{{quantity}}</div><!-- verify that $scope.quantity exists --> 
<button class="button button-full button-positive" ng-click="addToOrder()"> 
    Add to Cart 
</button> 

爲什麼$scope.quantity回報不確定即使數據發生結合和T

ASIDE$localstorage是我定義爲一個模塊一個AngularJS包裝器,用於訪問本機window.localStorage對象,以防萬一你想知道。

編輯:這是我的app.js文件,我定義了我的狀態。下面是有關menumenu-details狀態以供參考......

.state('tabs.menu', 
    { url: '/menu', 
    views: { 
     'tab-menu': { 
     controller: 'MenuCtrl', 
     templateUrl: 'views/menu.list.html' 
     } 
    } 
}) 
.state('tabs.menu-details', 
    { url: '/menu-details/:menuItemId', 
    views: { 
     'tab-menu': { 
     controller: 'MenuDetailCtrl', 
     templateUrl: 'views/menu.details.html', 
     resolve: { 
      menuItemId: ['$stateParams', function($stateParams) { 
      return $stateParams.menuItemId; 
      }] 
     } 
     } 
    } 
}) 
+3

你只需要$ scope.apply如果'addToOrder'由一個事件的角度週期之外調用,如調用地理位置如果 – 2014-12-03 19:55:51

+0

'$ apply'拋出例外,那麼談論進一步執行你的代碼是沒有意義的。 – akonsu 2014-12-03 19:56:41

+0

對不起,'$ apply()'是我控制器中的一個工件。請忽略。 @akonsu – 2014-12-03 19:57:38

回答

0

正如評論前面提到的,你應該去的controllerAs解決方案。爲每個視圖添加具有唯一名稱的controllerAs屬性。然後在您的模板中,您可以使用代表範圍的名稱。

因此,例如,在您的視圖中使用:

{ controllerAs: 'mainctrl' }

,並在您的視圖{{mainctrl.quantity}}

controllerAs的發明防止這種各種典型的角型頭痛。

0
<input type="number" ng-model="quantity" value="1"> 

出於某種原因,value屬性不綁定到$scope.quantity在頁面加載。因此,$scope.$digest不在監聽對該變量的更改。在我MenuItem.get()我初始化變量出現,就像這樣:

MenuItem.get($stateParams.menuItemId) 
    .success(function(data) { 
     $scope.menuItem = data; 
     $scope.quantity = 1; 
}); 

它的工作原理,即使你把屬性的值存在。但它是微不足道的。

可能在這個問題上缺乏明確性,因爲假設quantity可能是menuItem的一個先前存在的屬性。此情況並非如此。這是生成OrderItem時附加到本地實例的額外數據。這與MenuItem不同,因爲MenuItem包含數據,因爲它將顯示在菜單上。 OrderItem包含訂單上顯示的數據(例如訂購數量)。

ASIDE:I referenced this article當研究@ WalterBrand的答案。但我明白,這是爲了處理父母與子女關係之間的數據,這不是......

謝謝您的幫助大家...