我有一个角度应用程序,它实现了工厂函数来处理对几乎所有控制器中实现的全局对象的一些 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 属性未定义并且需要作为这些其他函数的参数。此外,$rootScope.user.cart 属性在我刷新浏览器后获得其值(但我不能将其作为解决方案),我对 Angular 很陌生,所以任何帮助将不胜感激,这让我发疯了!
发现$rootScope有点难以使用,并且在 AngularJS 中是一种反模式......这就像在 vanilla JS 中将变量放在全局范围内一样。
有什么理由不通过将购物车保留在 CartFactory 中,然后将 API 放在 CartFactory 中来获取购物车,然后将任何购物车返回给任何感兴趣的控制器,从而避免整个 $rootScope.user.cart 问题?
$rootScope上设置"user"属性的位置? 您能否放置整个代码,并且始终在从对象读取嵌套属性之前,检查未定义,在您的情况下输入if($rootScope.user) {//您的逻辑}