我是新来的承诺概念,我正在尝试提交登录表单时遇到问题。
当promise被解决时,我想通过更改范围变量的值来更新ui。
这是控制器方法,称为
$ctrl.loginForm = function(isValid) {
// check to make sure the form is completely valid
if (isValid) {
LoginService.login($ctrl.user).then(function (value) {
$ctrl.loginError = false;
var cookie = value.token;
}, function (reason) {
$ctrl.loginError = true;
});
}
};
这是我的服务方法
service.login = function(credentials) {
return new Promise((resolve, reject) => {
$http.post(AppConst.Settings.apiUrl + 'api-token-auth/',credentials).success((data) => {
resolve(data);
}).error((err, status) => {
reject(err, status);
});
});
};
因此,一旦解析了promise,控制器中的$ ctrl.loginError就会改变它的值,但它不会在UI上更新。
我尝试使用$ apply它有效,但我不明白为什么我必须使用$ apply!我认为摘要周期默认开始!
我做错了什么?
答案 0 :(得分:0)
$http
方法返回一个$ q服务的承诺。所以,问题是你使用原生的promise包装器,它不会告诉angular的范围运行$ apply方法。
将您的服务更改为以下
service.login = function(credentials) {
return $http.post(AppConst.Settings.apiUrl + 'api-token-auth/',credentials);
};