1

更新: JS のコード

angular-appから認証 (セッション) サービスを借用し、大幅に変更しました。

  angular.module('auth', [])
    .factory('session', ['$location', '$http', '$q', ($location, $http, $q) ->

      service =

        requestCurrentUser: ->
          if service.isAuthenticated()
            $q.when service.currentUser
          else
            $http.get('/user').then (response) ->
              console.log(response.data)
              service.currentUser = response.data
              service.currentUser

        currentUser: null

        isAuthenticated: ->
          not service.currentUser?

      service
    ])

これはアプリです:

  BookReader = angular.module('BookReader', ['ngRoute', 'home', 'main', 'books', 'auth'])

  BookReader
    .config(['$routeProvider', '$httpProvider', '$locationProvider', ($routeProvider, $httpProvider, $locationProvider) ->
      $routeProvider
        .when '/',
          templateUrl: 'assets/tour.html'
          controller: 'MainCtrl'
        .when '/home',
          templateUrl: 'assets/main.html'
          controller: 'HomeCtrl'
        .when '/books',
          templateUrl: 'assets/books.html'
          controller: 'BooksCtrl'
    ])
    .run(['session', (session) ->
      session.requestCurrentUser()
    ])

したがって、アプリケーションが起動すると、 currentUser が要求されると思います(おそらく、要求のコールバックの前にコントローラーが動作を開始しますが、問題は別の場所にあります)。次に、コントローラー:

angular.module('main', ['ngCookies'])
  .controller('MainCtrl', ['$scope', '$http', '$cookies', '$location', 'session', '$log',
    ($scope, $http, $cookies, $location, session, $log) ->
      $log.info "currentUser: " + session.currentUser + " ; isAuth: " + session.isAuthenticated()
      $location.path '/home' if session.isAuthenticated()
  ])


angular.module('home', ['ngCookies'])
  .controller('HomeCtrl', ['$scope', '$http', '$cookies', 'session', '$location', '$log'
    ($scope, $http, $cookies, session, $location, $log) ->
      $log.info "currentUser: " + session.currentUser + " ; isAuth: " + session.isAuthenticated()
      $location.path '/' unless session.isAuthenticated()
  ])

ポイントは、ユーザーがログインしているときはisAuthenticated()常にfalseですが、currentUsernull ではないということです。したがって、ログインすると、サイトが読み込まれたときだけでなく、ナビゲートしているときにも表示されます$log.infocurrentUser: [object Object] ; isAuth: falseログアウトすると、 が表示されますcurrentUser: null ; isAuth: false。明らかにcurrentUser、サービス内では常に null です。しかし、値を変更できるように定義するにはどうすればよいですか?

4

2 に答える 2

1

isAuthenticated を更新

isAuthenticated: ->
      service.currentUser?

これは非同期ですが、ルーターで解決を使用する必要があります。

于 2013-10-14T12:30:23.117 に答える