我有一个角度应用程序,它实现工厂函数来处理几乎所有控制器中实现的全局对象的一些API请求。
factory.loadCart = function() {
var deferred;
deferred = $q.defer();
httpService.get({
service: 'cocacola',
param1: 'userCart',
guid: sessionStorage.token
}, function(r) {
if (r.error == 0) {
$rootScope.user.cart = r.result;
deferred.resolve(r.result);
} else {
deferred.reject("Error al cargar el carrito.")
}
}, function(errorResult) {
deferred.reject(errorResult);
});
return deferred.promise;
}
在代码中,我将user.cart属性的值设置为请求的结果。当我去另一个也实现这种工厂方法的控制器时(以这种方式)......
CartFactory.loadCart().then(function(response) {
$rootScope.user.cart = response;
$scope.cart = $rootScope.user.cart;
if ($rootScope.user.cart.productos.length == 0) {
$state.go('main.tienda');
} else {
getCards();
$rootScope.showCart = false;
}
}, function(error) {
$scope.loading = false;
$scope.showMe = false;
$state.go('main.tienda');
console.log(error);
});
...并返回第一个控制器,user.cart属性未定义,我无法继续执行定义为工厂方法的其他函数,因为$ rootScope.user.cart属性是undefined并且需要作为这些其他函数的参数。此外,$ rootScope.user.cart属性在刷新浏览器后获取其值(但我不能将其作为解决方案),我对Angular很新,所以任何帮助都会非常感激,这让我疯了!
答案 0 :(得分:0)
我总是发现$ rootScope有点难以使用,而AngularJS中的反模式......就像把变量放在vanilla JS的全局范围内一样。
有没有理由你不能避免整个$ rootScope.user.cart问题,只需将购物车保存在CartFactory中,然后将一个API放入CartFactory中,然后将任何购物车返回给任何感兴趣的控制器?
答案 1 :(得分:0)
您设置用户' $ rootScope上的属性?你能不能把整个代码放在从对象读取嵌套属性之前,检查undefined,在你的情况下把if($ rootScope.user){//你的逻辑}