AngularJS $ location.path在Parse Promise上不起作用

orb*_*kov 1 javascript angularjs parse-platform

我的parse / AngularJS应用程序正在使用Promises。在登录功能是假设重定向与用户$ location.path,但我不得不调整它,使其根据该岗位工作:

在AngularJS中$ location.path不会在工厂中更改

根据这一SO用户,你需要将调用替换到$ location.path

$rootScope.$apply( function(){$location.path('/somelocatin'); } );
Run Code Online (Sandbox Code Playgroud)

在这里查看答案: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;
            });
    };
Run Code Online (Sandbox Code Playgroud)

和身份验证服务的实现:

    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 };
            }
        });

    }
Run Code Online (Sandbox Code Playgroud)

(可在此处找到原始登录源:http : //jasonwatmore.com/post/2015/03/10/AngularJS-User-Registration-and-Login-Example.aspx

Est*_*ask 5

因为$location Angular摘要周期以及许多其他Angular内置服务紧密相关,所以$location.path 所做的只是更新内部$$ path属性。在下一个摘要中,它将用于更新路径。

并且由于$http还与摘要相关,因此在解决或拒绝诺言时会触发摘要。通常,无需担心手动触发摘要,$ location将在下一个摘要期间更新位置。引用的问题中的另一个答案明确指出了这一点

由于承诺不是由内置服务提供的,而是由提供的Parse,因此摘要需要手动触发,因此Angular会“知道”位置已更新。考虑

$location.path('/');
$rootScope.$apply();
Run Code Online (Sandbox Code Playgroud)

语法,如果您更满意的话。

可以设置观察者来调查摘要何时击中以及此时位置路径发生了什么

$rootScope.$watch(function () {
  console.log('digest! and the path is ' + $location.$$path);
});
Run Code Online (Sandbox Code Playgroud)