2015-01-26 3 views
3

У меня есть приложение angularJS, которое включает функции входа в систему, используемые в бэкэнд с помощью экспресс-паспорта; это до недавнего времени работало нормально, но я изменил некоторые вещи, и теперь он не работает, и я не знаю, как исправить свою проблему.angularJS область действия не обновляется после HTTP get

После входа на страницу входа вы должны быть перенаправлены к индексу и переменной $ scope.cUser.userName должно быть ваше текущее имя пользователя, однако страница не обновляет область для имени пользователя, пока я не обновляю (f5) всю страницу! Интересно, что значение $ scope.cUser.created делает обновление и корректно отображать на странице .. Я могу подтвердить, что экспресс-доставку правильно имени пользователя для угловых в формате JSON

метода Войти в контроллере входа:

$scope.login = function(){ 
     $http.post('/users/login', { 
      username: $scope.user.username, 
      password: $scope.user.password 
     }) 
     .success(function(user){ 
      toaster.pop('success', "Success!", "You have been logged in"); 
      $rootScope.$broadcast('loggedIn', user); 
      $location.path('/'); 
     }) 
     .error(function(user){ 
      toaster.pop('error', 'We couldn\'t log you in!', 'The provided user credentials are incorrect'); 
      $location.url('/login'); 
     }); 
    }; 

проверить, если войти в систему на приложение запуска:

$http.get('/users/loggedin').success(function(user){ 
      if (user.loggedin !== false){ 
       $rootScope.$broadcast('loggedIn', user); 
      } else { 
       $rootScope.$broadcast('loggedOut'); 
      } 
     }); 

и это мой «mainController», которая действует на весь сайт за пределами нг ракурса:

$scope.cUser = {}; 
     $scope.$on('loggedIn', function(event, user){ 
      $timeout(function(){ 
       $scope.$apply(function(){ 
        $scope.cUser.loggedIn = true; 
        $scope.cUser.userName = user.username; 
        $scope.cUser.created = user.created; 
       }); 
      }); 
     }); 

     $scope.$on('loggedOut', function(event){ 
      $scope.cUser.loggedIn = false; 
      $scope.cUser = {}; 
      $scope.$apply(); 
     }); 

Функция выхода из системы работает должным образом, но имя $ scope.cUser.userName не отображается на странице! Пожалуйста помоги!

+1

не использовать '$ scope. $ Apply();' он может разорвать выполнение, если '$ apply' уже выполняется .try' if (! $ Scope. $$ phase) $ scope. $ Apply(); ' –

+0

Вы можете создать плункер или jsfiddle, реплицируя проблему? – SoluableNonagon

+1

@pankajparkar, это так же бессмысленно, так как в любом случае это «тайм-аут», что само по себе было так же бессмысленным, поскольку событие запускается изнутри Angular в обработчике успеха. Таким образом, все как применение, так и таймаут бессмысленны и являются довольно распространенным анти-шаблоном в Angular. –

ответ

1

отладки попытка распечатав как пользователя и имя пользователя в этих функциях

$scope.$on('loggedIn', function(event, user){ 
     //$timeout(function(){ // you don't need apply or timeout here, its automatic 
      //$scope.$apply(function(){ 
       console.log('logged in', user); 
       $scope.cUser.loggedIn = true; 
       $scope.cUser.userName = user.username; 
       $scope.cUser.created = user.created; 
      //}); 
     //}); 
    }); 

    $scope.$on('loggedOut', function(event){ 

     $scope.cUser.loggedIn = false; 
     $scope.cUser = {}; 
     console.log('logged out', $scope.cUser); 
     //$scope.$apply(); 
    }); 

и включают cUser в вас HTML следующим образом:

<div> {{cUser}} </div> <!-- this should print a json object --> 

, чтобы увидеть, что в настоящее время хранится в значении.

Далее убедитесь, что у вас есть сценарий ошибки покрыты, а также с $ HTTP вызова:

$http.get('/users/loggedin').then(function(){ 
     var user = response.data; 
     console.log('user', user); 
     if (user.loggedin !== false){ 
      $rootScope.$broadcast('loggedIn', user); 
     } else { 
      $rootScope.$broadcast('loggedOut'); 
     } 
    }, function(reason){ 
     // this is the error scenario 
     console.log('error', reason); 
    }); 

Это должно получить Вас ближе к ответу на то, что проблема есть.

+0

Добавление {{cUser}} на страницу показало мне, что после входа в систему перед обновлением страницы объект JSON содержит только зарегистрированные loggedIn: истинные и созданные данные, и нет упоминания имени пользователя в JSON .. но когда вы обновляете внезапное имя пользователя включено в JSON? Я бы подумал, что это проблема с серверами, но она корректно работает на втором http.get .. возможно, существует разница между $ broadcast loggedIn после входа в систему и после обновления страницы (app.run) – imattacus

+0

Я исправил ее! Произошла ошибка в экспресс-бэкэнде - спасибо за вашу помощь, хотя я бы никогда не заметил, что если бы я просто не посмотрел на {{cUser}}, спасибо – imattacus

+0

@imattacus, рад, я рад, что я может помочь вам. Если это не так уж сложно, можете ли вы также проголосовать за ответ? – SoluableNonagon

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