我的解析/ AngularJS应用程序正在使用Promises。 登录功能假设用 $ location.path 重定向用户,但是我必须根据这篇帖子调整它以使其工作:
$location.path doesn't change in a factory with AngularJS
根据此SO用户,您需要将 $ location.path 的调用替换为
$rootScope.$apply( function(){$location.path('/somelocatin'); } );
请在此处查看答案: https://stackoverflow.com/a/19738154/1743693
这解决了这个问题,但我必须明白:为什么原生呼叫不起作用?调整如何解决问题?我怎么知道我没有搞砸AngularJS循环?或者它是否与Promise模式的Parse实现更相关?
这是登录代码:
function login() {
vm.dataLoading = true;
var response = AuthenticationService.Login(vm.email, vm.password).then(
function (user) {
vm.dataLoading = false;
//$location.path('/'); -- <-- **doesn't work**
vm.user = Parse.User.current().getEmail();
$rootScope.$apply(function () { $location.path('/'); });
},
function () {
$rootScope.$apply(function () { $location.path('/login'); });
FlashService.Error(response.message);
vm.dataLoading = false;
});
};
验证服务实施:
function Login(username, password, success, error) {
return Parse.User.logIn(username, password, {
success: function (user) {
return user;
},
error: function (user, error) {
return { user: user, error: error };
}
});
}
(原始登录来源可在此处找到:http://jasonwatmore.com/post/2015/03/10/AngularJS-User-Registration-and-Login-Example.aspx)
答案 0 :(得分:4)
由于$location
is tightly tied到Angular摘要周期,以及许多其他Angular内置服务,所有$location.path
does is updating internal $$path property。它将用于在下一个摘要中更新路径。
并且因为$http
也与摘要相关联,所以当承诺被解决或拒绝时,它会触发摘要。通常,无需担心手动触发摘要,$ location将在下一个摘要期间更新位置。引用问题states this中的另一个答案毫不含糊。
由于承诺不是由内置服务提供的,而是由Parse
提供,因此需要手动触发摘要,这样Angular“知道”该位置已更新。考虑
$location.path('/');
$rootScope.$apply();
语法,如果它让你高兴的话。
可以设置一个观察者来调查摘要何时命中以及当时位置路径发生了什么
$rootScope.$watch(function () {
console.log('digest! and the path is ' + $location.$$path);
});