2016-11-21 2 views
0

У меня есть следующий код:AngularJS: ngClass не является обновлением после запроса HTTP

angular.module('myApp') 
 
    .controller('MyCtrl', function ($scope,$rootScope, $filter, $location,$translate,$cookies,NavigationService) { 
 
    
 
\t   $scope.appVersion = ""; 
 
\t   $scope.credentials = {}; 
 
\t   $scope.userLanguage = null; 
 
\t   
 
\t   var init = function(){ 
 
\t   \t authenticate(); 
 
\t   \t getAppVersion(); 
 
\t   }; 
 
\t   
 
\t   var getAppVersion = function() { 
 
\t   \t NavigationService.getAppInfo() 
 
\t     .then(function (response) { 
 
\t      $scope.appVersion = response.data.build.version 
 
\t     }); 
 
\t   }; 
 
\t   
 
\t   var authenticate = function (credentials, callback) { 
 
\t    $rootScope.authorities = []; 
 
\t    $rootScope.currentUser = null; 
 

 
\t    NavigationService.doAuthentication(credentials).success(function (data) { 
 
\t     $rootScope.authenticated = !!data.name; 
 
\t     $rootScope.authorities = data.authorities; 
 
\t     $rootScope.currentUser = data.name; 
 
\t     $scope.userLanguage = data.userLang; 
 
\t     callback && callback(); 
 
\t    }).error(function (response) { 
 
\t     $rootScope.authenticated = false; 
 
\t     callback && callback(); 
 
\t    }); 
 
\t   }; 
 
...
<div ng-show="authenticated" class="btn-group btn-group-xs btn_change_language"> 
 
     <button ng-class="{'button_selected': userLanguage == 'de'}" class="btn btn-default" 
 
       ng-click="changeLanguage('de')" translate> 
 
      BTN_GERMAN_LANGUAGE 
 
     </button> 
 
        
 
     <button ng-class="{'button_selected': userLanguage == 'en'}" 
 
       class="btn btn-default" ng-click="changeLanguage('en')" translate> 
 
      BTN_ENGLISH_LANGUAGE 
 
     </button> 
 
</div>

Проблема заключается в том, что когда я открываю браузер и загрузить страницу, директива ngClass получить начальное значение userLanguage (null), а не значение, которое приходит из моего запроса (data.userLang), поэтому класс «buttom_selected» не применяется. Я уже отлаживал его, и значение начинается нормально, однако ngClass просто обновляется, если я перезагружаю страницу. Странно то, что, если я открываю новую вкладку, она работает нормально, но если я закрою и открою браузер и получаю доступ к приложению, ngClass игнорирует изменение, сделанное обратным вызовом NavigationService.

Я попробовал $ scope. $ Apply(), но он говорит, что $ digest уже выполняется.

+0

вы можете использовать $ таймаут, если вы сталкиваетесь с $ переваривать в процессе ошибка, так как в конце таймаута вызывается $ apply. Смотрите: http://stackoverflow.com/questions/12729122/angularjs-prevent-error-digest-already-in-progress-when-calling-scope-apply. Однако главная проблема - это что-то еще. –

+0

Похоже, что у вас есть другая ошибка на вашей странице, так как код, который у вас есть в ng-классе, выглядит правильно. Если вы просто выведете {{userLanguage}}, то где-то на вашей странице оно обновится, как ожидалось? – jtsnr

+0

@KiranYallabandi, спасибо за ваш ответ. Я пробовал эти решения, но, к сожалению, он не работает. –

ответ

0

Я не уверен, попробуйте использовать объект вместо строки.

$scope.userLanguage = {title: null}; 

Если это не работает, то сделать минимальный пример, как это и попытаться понять, что это не так:

<button 
     ng-class="{'active': userLanguage == 'de'}" 
     ng-click="userLanguage = 'de'">BTN_GERMAN_LANGUAGE</button> 
    <button 
     ng-class="{'active': userLanguage == 'en'}" 
     ng-click="userLanguage = 'en'">BTN_ENGLISH_LANGUAGE</button> 

Example

+0

Привет @Gennady, спасибо за ваш ответ, но, к сожалению, это не сработало. –

+0

Я обновил свой ответ –

+0

Привет @Gennady, еще раз спасибо. Я видел ваш пример, однако мой сценарий немного отличается. Когда я звоню в кнопках, он работает нормально, проблема в том, что я загружаю страницу вызовом $ http. Моя переменная не обновляется со значениями, которые входят в функцию обратного вызова, когда я загружаю приложение в первый раз. –

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