我有一个工厂服务来控制购物车,当我还在配置购物车时,我将会出现与控制器同步数据的问题。
该过程包括分析用户是否已登录。如果他不,那么spCart = 0
,如果他被记录,那么我将不得不进行其他验证。让我们说我还有2个验证要做:
如果用户没有有效地址,则spCart = 1
;
如果他有一个地址并且在该范围内,
spCart = [
'items':[], //add items here
cost: '0'
];
或者如果不在范围内:
spCart = [
'items':[], //add items here
cost: '9.99'
];
问题是,其中一些验证需要等待$http
,这样我就无法将来自工厂的spCart
值与控制器同步。这就是我所做的:
控制器:
function CartController(factCart) {
var sp = this;
factCart.initialLoad();
sp.cart = factCart.getCart();
};
工厂:
function factCart (localStorageService,factMain) {
var spCart = 0;
var service = {
initialLoad: _initialLoad,
getCart: _getCart
};
return service;
function _initialLoad() {
var userData = localStorageService.cookie.get(ngApp);
if (userData) {
var func = 'load_address';
factMain.methodGet(func).then(function(res){ //$http from main factory
if(res==0) {
return spCart = [1];
} else {
_checkRange(res);
}
});
} else if (!userData) {
return spCart;
};
};
function _checkRange(data) {
spCart = [];
spCart['items'] = [];
/*
logic here
*/
if (inRange) {
spCart['costs'] = {
cost: 0;
};
return spCart;
} else {
spCart['costs'] = {
cost: 9.99;
};
return spCart;
};
};
function _getCart() {
return spCart;
};
};
问题是,spCart
值始终为0
,更新后它不会发生变化,我也不知道如何解决此问题
注意:将商品添加到购物车时出现此问题,视图未更新。我使用$apply()
解决了这个问题。但在这种情况下,我无法使用$apply
,它说“无法阅读财产......'
答案 0 :(得分:0)
我设法让它发挥作用。我不知道这是否是最好的解决方案,所以我会打开问题。
但是我必须保持初始数组就像我想要的那样,当所有的验证都没问题并添加一个额外的字段来控制一切。
所以我会有一个像这样的数组:
spCart = [];
spCart['address'] = {
verification: 0,
address: 'name of address',
//..etc..
};
spCart['items']= [];
//..Rest of array - for checkout only
这样,verification
内的数据正在更新。这不是最好的方式(或者至少不是我的预期),因为我暴露了整个数组,而不是单个值。
所以,如果有更好的解决方案,那将非常受欢迎。