17

Angular JS アプリにヘッダー/フッターを実装しようとしています。これらをメインのindex.htmlにng-includeとして追加することを考えていました。ただし、ヘッダーとフッターが静的ページである場合、これは機能します。私の場合は少し異なります...ログインページにヘッダー/フッターが表示されません。ログインしているかどうかに応じて、他のページでは「Welcome user [ logout] 」または「Welcome guest [ login ]」を表示する必要があります。

ログイン情報と isLoggedIn をサービスに保存し、HeaderCtrl コントローラーを使用してそれを $scope にコピーします。最大の問題は、ログオフ時に ng-include 全体が更新されないことです。したがって、ng-show hide ディレクティブを含む div は、変更時に非表示/表示されません。誰かが ng-switch の使用を提案しました - それも同じように動作します。

ヘッダー コードを個々のビュー内に移動すると、すべて問題ありません。

同様の質問がここにあります: angularjs AngularJS でヘッダー ページを更新する - ヘッダーやフッターなどの繰り返されるフラグメントを処理する

以前にこの質問をしましたが、ログに記録された変数を rootScope から移動したときに、答えが役に立ちませんでした。問題は、私の HeaderCtrl がページ全体の更新でのみ実行されていることです。Angular ページ ナビゲーションなどでは実行されません。

コードは次のとおりです: index.html:

<body ng-app="greenhornApp">
    <div id="navbar" ng-controller="HeaderCtrl"><div ng-include src="'views/partials/header.html'"></div>
    </div>
    <div class="title-spacer visible-desktop"></div>
    <!-- Add your site or application content here -->
    <div class="wrapper" ng-view></div>
</body>

header.js:

angular.module('greenhornApp')
  .controller('HeaderCtrl', ['$scope', 'LoginService', function ($scope, loginService) {
    $scope.isLoggedIn = loginService.isLoggedIn();
    $scope.session = loginService.getSession();
  }]);

header.html

<div>
  <div ng-show="isLoggedIn">
    <div class="navbar navbar-inverse navbar-fixed-top">
More stuff here....
    </div>
  </div>
</div>

私は ng-route と angular 1.2.0-rc3 を使用しています。HeaderCtrl にブレークポイントを設定しました... ページ全体を更新した場合にのみ実行されます。ここで何が間違っていますか?

4

2 に答える 2

19

loginService.isLoggedIn()オブジェクトではなくプリミティブ値にバインドされている場合は、変数を監視し、変化に応じて新しい値を取得するためHeaderCtrlに使用する必要があります。$watch

なしで動作$watchさせるには、オブジェクト参照が your から your に渡されていることを確認する必要がありloginServiceますHeaderCtrl

うまくいけば、いくつかのガイダンスを提供するのに十分な状況を再現する2つの簡単なプランカーを作成しました。

プリミティブと$watch: http://plnkr.co/edit/LvtVEE?p=preview

オブジェクト参照あり、なし$watch: http://plnkr.co/edit/2u2ZDE?p=preview

于 2013-10-20T10:29:31.330 に答える