2015-09-15 2 views
0

Приложение для разбора/AngularJS использует Promises. Войти функция было предположить, чтобы перенаправить пользователя с $ location.path, но я должен был настроить его, чтобы заставить его работать в соответствии с этой должности:

$location.path doesn't change in a factory with AngularJS

В соответствии с этим так что пользователь, вам нужно заменить вызов $ location.path с

$rootScope.$apply(function(){$location.path('/somelocatin'); }); 

См ответ здесь: https://stackoverflow.com/a/19738154/1743693

Это решило проблему, но я должен понимать: ПОЧЕМУ не работает родной звонок? и как эта проблема решает проблему? как я узнаю, что я не закручиваю цикл AngularJS? или это нечто большее, чем реализация Parse шаблона Promise?

Это код Логин:

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)

ответ

3

Поскольку $locationis tightly tied угловому дайджест циклов, а также многие другие Угловые встроенные услуги, все, что $location.pathdoes is updating internal $$path property. Он будет использоваться для обновления пути во время следующего дайджест.

И поскольку $http также привязан к дайджесту, он запускает дайджест, когда обещание разрешается или отклоняется. Как правило, нет необходимости беспокоиться, чтобы запустить дайджест вручную, $ location обновит местоположение во время следующего дайджеста. Другой ответ в указанном вопросе states this однозначно.

Поскольку обещание не было предоставлено встроенным сервисом, но по Parse, дайджест должен запускаться вручную, таким образом Угловой «знает», что местоположение было обновлено. Рассмотрим

$location.path('/'); 
$rootScope.$apply(); 

синтаксис вместо этого, если вам это нравится.

Можно настроить Бодрствующий исследовать, когда дайджест попадет и то, что происходит с путем расположения в тот момент

$rootScope.$watch(function() { 
    console.log('digest! and the path is ' + $location.$$path); 
}); 
+0

Спасибо! Я ломал голову, но «$ scope. $ Apply();« отлично справлялся со мной. Не знал, что этот метод также применим к силовому обновлению '$ location'. – user2513149

+0

Речь идет не о '$ location', а о том, чтобы Angular узнал об изменениях, которые были сделаны в неагрегационных асинхронных обратных вызовах (и обратный вызов Parse' then'). Если вы действительно не хотите исследовать Угловые внутренности каждый раз, когда это происходит, разумно предположить, что Угловые службы всегда так или иначе полагаются на цикл дайджеста, а '$ rootScope. $ Apply()' следует вызывать в конце неагломератного обратного вызова. – estus

Смежные вопросы