工厂更改时更新控制器中的值
Update value in controller when factory changes
我有一个工厂服务来控制购物车,当我还在配置购物车时,我将无法与控制器同步数据。
该过程包括分析用户是否登录。如果他不是,那么spCart = 0
,如果他登录了,那我就得做其他的验证了。假设我还有 2 个验证要做:
- 如果用户有一个有效的地址,
- 如果地址在一个范围内,则运费为0;
如果用户没有有效地址,则 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
,它说 'Cannot read property...'
我成功了。我不知道这是否是最好的解决方案,所以我会继续提问。
但是当所有验证都正常时,我必须保留初始数组,就像我希望的那样,并添加一个额外的字段来控制所有内容。
所以我将有一个这样的数组:
spCart = [];
spCart['address'] = {
verification: 0,
address: 'name of address',
//..etc..
};
spCart['items']= [];
//..Rest of array - for checkout only
这样 verification
中的数据正在更新。这不是最好的方法(或者至少不是我的预期),因为我公开了整个数组,而不是单个值。
所以,如果有更好的解决方案,将不胜感激
我有一个工厂服务来控制购物车,当我还在配置购物车时,我将无法与控制器同步数据。
该过程包括分析用户是否登录。如果他不是,那么spCart = 0
,如果他登录了,那我就得做其他的验证了。假设我还有 2 个验证要做:
- 如果用户有一个有效的地址,
- 如果地址在一个范围内,则运费为0;
如果用户没有有效地址,则 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
,它说 'Cannot read property...'
我成功了。我不知道这是否是最好的解决方案,所以我会继续提问。
但是当所有验证都正常时,我必须保留初始数组,就像我希望的那样,并添加一个额外的字段来控制所有内容。
所以我将有一个这样的数组:
spCart = [];
spCart['address'] = {
verification: 0,
address: 'name of address',
//..etc..
};
spCart['items']= [];
//..Rest of array - for checkout only
这样 verification
中的数据正在更新。这不是最好的方法(或者至少不是我的预期),因为我公开了整个数组,而不是单个值。
所以,如果有更好的解决方案,将不胜感激