2016-11-21 13 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-classにあるコードが正しいように見えるので、ページ上の他のエラー。 {{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呼び出しでページを読み込むときです。私の変数は、初めてアプリケーションを読み込むときに、コールバック関数に含まれる値で更新されていません。 –

関連する問題