3

ログイン後に AngularJS を使用して Meteor の特定のページにリダイレクトしようとしています。しかし、どういうわけかそれは機能していません。ログイン後、Meteor.user() は null を返します。このため、毎回メッセージ ページのみにルーティングされます。私はフォーラムの 1 つからこの例を見て、その上に開発しました。

angular.module("jaarvis").run(["$rootScope", "$state", "$meteor", function($rootScope, $state, $meteor) {

   $meteor.autorun($rootScope, function(){
      if (! Meteor.user()) {
        console.log('user');
        if (Meteor.loggingIn()) {
          console.log('loggingIn ' + Meteor.user()); -- returning null
          if(Meteor.user()) {
            $state.go('onlineusers');
          } else {
            //On login
            $state.go("messages");
          }
        }
        else{
          console.log('login');
          $state.go('login');
        }
      }
     });

}]);

以下のように宣言されたルート。

angular.module('jaarvis').config(['$urlRouterProvider', '$stateProvider', '$locationProvider',

    function($urlRouterProvider, $stateProvider, $locationProvider){
      $locationProvider.html5Mode(true);
      $stateProvider
        .state('login', {
          url: '/login',
          templateUrl: 'login.ng.html',
          controller: 'LoginCtrl'
        })
        .state('onlineusers',{
          url: '/onlineusers',
          templateUrl: 'client/onlineusers/onlineusers.ng.html',
          controller: 'OnlineUsersCtrl'
        })
        .state('messages', {
          url: '/messages',
          templateUrl: 'client/chats.ng.html',
          controller: 'ChatCtrl'
        })
        });
      $urlRouterProvider.otherwise("/messages");
    }]);

以下のコード スニペットを使用したログ記録。

<meteor-include src="loginButtons"></meteor-include>
4

2 に答える 2

2

問題の根本的な原因については Michael がおそらく正しいと思いますが、Angular-Meteorの認証方法によって、より良い代替手段が提供されると思います。

あなたがやりたいことは、ルート上のプロミスの解決を強制することです。Angular-Meteor ドキュメントから (つまり、一般的な例...):

// In route config ('ui-router' in the example, but works with 'ngRoute' the same way)
$stateProvider
  .state('home', {
    url: '/',
    templateUrl: 'client/views/home.ng.html',
    controller: 'HomeController'
    resolve: {
      "currentUser": ["$meteor", function($meteor){
        return $meteor.waitForUser();
      }]
    }
});

特定のコードは次のようになります。

angular.module('jaarvis').config(['$urlRouterProvider', '$stateProvider', '$locationProvider',
function($urlRouterProvider, $stateProvider, $locationProvider){
  $locationProvider.html5Mode(true);
  $stateProvider
    .state('login', {
      url: '/login',
      templateUrl: 'login.ng.html',
      controller: 'LoginCtrl'
    })
    .state('onlineusers',{
      url: '/onlineusers',
      templateUrl: 'client/onlineusers/onlineusers.ng.html',
      controller: 'OnlineUsersCtrl',
      resolve: {
          "currentUser": ["$meteor", function($meteor){
               return $meteor.waitForUser();
           }]
      }
    })
    .state('messages', {
      url: '/messages',
      templateUrl: 'client/chats.ng.html',
      controller: 'ChatCtrl',
      resolve: {
          "currentUser": ["$meteor", function($meteor){
               return $meteor.waitForUser();
           }]
      }
    })
    });
  $urlRouterProvider.otherwise("/messages");
}]);

そして、ChatCtrlコントローラーで、次のように、注入する変数の 1 つとしてOnlineUsersCtrl追加します。currentUser

angular.module("rootModule").controller("ChatCtrl", ["$scope", "$meteor", ..., 
    function($scope, $meteor, ..., "currentUser"){
        console.log(currentUser) // SHOULD PRINT WHAT YOU WANT
    }
]);

Promise についても検討し$meteor.requireUser()、Promise が拒否された場合はユーザーをログイン ページに戻すこともできます。このすべては、angular-meteor の Web サイトで非常によく文書化されています。

幸運を!

于 2015-09-14T03:29:37.570 に答える
1

ユーザー オブジェクトがまだ読み込まれていない可能性があります。あなたが試すことができます:

if ( Meteor.userId() ) ...

代わりは

于 2015-09-13T17:53:34.137 に答える