1

たぶん、2 ウェイ バインディングの使用は、$watchまだあまり明確ではありません..しかし、このコードが機能することを期待していました!

index.htmlページにtopNavbarディレクティブがあります。ユーザーがログインしていない場合、topNavbarloginButtonを表示する必要があります。それ以外の場合は、ログイン済みの場合はloginButtonを表示します。

だから私はtopNavbarng-switchにあり、CurrentUserServiceのisLogged属性を見ています。これは のようなものだと思います。$watch(CurrentUserService.isLogged)

ただし、 に変更CurrentUserService.isLoggedしてtrueも、ng-switchはすぐには更新されません。ボタンをクリックしてビューを変更するなど、私のアクションの後に更新されます。期待どおりに動作しないのはなぜですか?

これは私のコードです:

index.html

<html lang="it" xmlns:ng="http://angularjs.org" ng-app="epoiApp">
  ...
  <body style="overflow-y: auto;">
    ...
    <top-navbar></top-navbar>
    ...
  </body>
</html>

ディレクティブ テンプレート

<div ng-switch on="navbarCtrl.isLogged()">
  <div ng-switch-when="false">
    <login-button></login-button>
  </div>
  <div ng-switch-when="true">
    <loggedin-button></loggedin-button>
  </div>                                            
</div>

コントローラー navbarCtrl

controller:function(CurrentUserService)
            {
             this.isLogged = function()
                            {return CurrentUserService.isLogged();} 
            }

CurrentUserService

.service('CurrentUserService', function () 
  {   
   // initialization
   _islogged = false;

   this.isLogged = function() 
        { return _islogged; };

  }  

ありがとうございました

4

1 に答える 1

2

これがプランカーです。

モデルに変更があると、Angular はダイジェスト サイクルを開始します (これが、何らかの方法で UI を操作した後に更新に気付いた理由です)。

サービス内のクロージャー変数の変更はモデルの一部ではないため、$scope.$apply()この変数が更新されていることがわかっている場合は、ダイジェスト サイクルを手動で開始する必要があります。

于 2015-06-18T14:14:27.467 に答える