我遇到了一个问题,我设法找到了解决办法,但我正在寻找一些反馈,以确保我能以正确的方式做到这一点。
我在控制器中有一个函数来调用服务。如果失败,无论出于何种原因,我都会向用户显示错误消息。
//Controller
vm.login = function() {
vm.error = "";
Sessions.create(vm.user)
.then(function(result) {
$state.go("home");
})
.catch(function(result) {
vm.error = result.data.errors;
});
};
//Service
Sessions.create = function(data) {
return $http.post(API + "sessions", data)
.then(function(response) {
return response.data;
});
};
//View
.alert.alert-danger(role="alert" ng-show="vm.error") {{vm.error}}
上面的代码完全符合预期。当它命中vm.error = result.data.errors
时,错误消息正确显示给用户。
当我尝试为该服务添加一些额外的功能(localforage)时,我得到了一些奇怪的行为。这是我的新代码:
//Controller
vm.newLogin = function() {
vm.error = "";
Sessions.login(vm.user)
.then(function(result) {
$state.go("home");
})
.catch(function(result) {
vm.error = result.data.errors;
$scope.$digest(); //NEED THIS?!?
});
};
//Services
Sessions.create = function(data) {
return $http.post(API + "sessions", data)
.then(function(response) {
return response.data;
});
};
Sessions.login = function(data) {
return new Promise(function(resolve, reject) {
Sessions.create(data)
.then(function(result) {
//do stuff
})
.then(function(result) {
return resolve(result);
})
.catch(function(err) {
return reject(err);
});
});
};
//View
.alert.alert-danger(role="alert" ng-show="vm.error") {{vm.error}}
使用此代码,newLogin
中设置的错误消息不会显示给用户,除非我在其后添加$scope.$digest();
。我在这里做错了吗?我可以在catch
和login
内的newLogin
中记录并查看错误消息。为什么只在第二个版本中需要摘要?
答案 0 :(得分:0)
使用浏览器Promise API存在问题。您应该使用$q
服务来创建承诺。它与AngularJS框架更好地集成。请参阅AngularJS $q Service API Reference。
通常,您不直接在控制器或指令中调用$digest()
。相反,您应该调用$apply()
(通常来自指令内),这将强制$digest()
。但在您的情况下,AngularJS $q
服务将负责调用$apply()
。有关详细信息,请参阅AngularJS $rootScope.scope API Reference -- $digest