我正在构建一个小实用程序来处理AngularJS中用户的购物车。
以下是我的cart-service.js文件定义。
var myStoreCartService = angular.module("myStoreCartService", []);
myStoreCartService.factory('Cart', function() {
var userCart=[];
var cartSummary=[];
return{
addItemToCart: function(item) {
userCart.push(item);
},
retrieveCart: function(){
return userCart;
},
getCartSummary: function(){
cartSummary=[];
for (var key in userCart){
var currentItem={"productname":"","price":""};
if (userCart.hasOwnProperty(key)){
currentItem["productname"]=userCart[key].productname;
currentItem["price"]=userCart[key].price;
cartSummary.push(currentItem);
continue;
};
}
return cartSummary;
},
getCurrentTotal: function(){
alert("Sum function called "+ cartSummary);
var currentSum=0;
for (var key in cartSummary)
{
if (cartSummary.hasOwnProperty(key))
{
// get sum
currentSum = currentSum+parseInt(cartSummary[key].price);
alert(currentSum+" is current sum")
continue;
};
}
return currentSum;
}
}
});
以下是用于更新页面购物车的方法。(在页面控制器中定义)
function addItemToCartHelper(data){
Cart.addItemToCart(data);
$scope.cart=Cart.retrieveCart();
$scope.cartLength=$scope.cart.length;
$scope.userCartSummary=Cart.getCurrentTotal();
$scope.userCartSummaryFromService=Cart.getCartSummary();
}
我的问题是我没有得到正确的价格总和,我的价格总是少加一个项目。
我确实意识到,我的总成本总和的功能应该只在我的购物车摘要更新后运行,但在我的情况下,它会在购物车摘要更新功能启动之前运行。
我需要一种方法来确保在总计函数运行之前,购物车摘要已完成执行。
答案 0 :(得分:1)
对于您提到的最佳方法,您可以使用Angularjs提供的 Promise API($ q)服务。它用于同步,异步任务。与你的情况一样
Promise API用于在满足条件时履行承诺,即解决或拒绝。
您可以使用 $ q.defer()的延迟对象创建的承诺中的.then 示例:
var deferredObject = $q.defer();
var deferredPromise = deferredObject.promise;
deferredPromise.then(successCallback,errorCallback);
deferredObject.resolve() // Calls the successCallback
deferredObject.reject() // Will call errorCallback
有关更好的说明,请点击链接 - http://andyshora.com/promises-angularjs-explained-as-cartoon.html