1

我在 angularjs 中有以下代码,.run() 所以当应用程序初始时,我在 rootScope 下设置了 2 个变量。因为这些变量我决定在每个路由(页面)和控制器中使用。 异步

app.run(function($rootScope, $timeout, firebaseAuth) {
  $rootScope.$on('firebaseLoggedIn', function(event, authUser) {
    $timeout(function() {
        $rootScope._isLoggedIn = true;
        $rootScope._authUser = authUser;
    },0);
});

但是这里的问题是,当我在控制器中运行它时,它总是显示未定义。 除非我把它放在功能块中。所以我的猜测是控制器在.run()变量有价值之前运行;

app.controller('foo', function($scope){
    console.log($scope._authUser); //Always undefined

    //unless I do following
    //$scope.clickme = function() {console.log($scope._authUser)};
});

有什么建议我可以使用 .run() 中的 vars(async) 吗?

如果我在每个控制器中调用以下代码,似乎我一直在重复自己。

$rootScope.$on('firebaseLoggedIn', function(event, authUser) {});

更新 这是 firebaseLoggedIn 事件的来源。我想我不得不再次提及。回调是异步的。

app.service('firebaseAuth', ['$rootScope',
function($rootScope) {
    //Define firebase DB url
    this.firebaseRef = new Firebase("https://test.firebaseio.com");
    this.onLoginStateChanges = new FirebaseAuthClient(this.firebaseRef, function(error, user) {
        if (user) {
            $rootScope.$emit("firebaseLoggedIn", user); //authenticated user
        }
        else if (error) {
            $rootScope.$emit("firebaseLoginError", error); //authentication failed
        }
        else {
            $rootScope.$emit("firebaseLogout"); //user not login
        }
    });
}]);
4

1 回答 1

0

当注入器完成为您的应用程序加载所有模块时,将运行 run 方法。所以你关于你的控制器首先被实例化的假设是正确的。

您使用 $timeout(function() { ... },0) 有效地执行的操作是强制该代码在下一个摘要循环中运行。但我不认为这是你想要完成的事情。

我不确定“firebaseLoggedIn”是从哪里广播的;但是您可能会发现整个实现作为 Angular 服务会更直接。

app.service('FireBaseService', function($rootScope) {
   // store these inside the service to be retrieved via methods below.
   var isLoggedIn = false;
   var authUser = {};

   // let this be the only place you handle the LoggedIn event, setting user context. 
   $rootScope.$on('firebaseLoggedIn', function(event, authUser) {
      isLoggedIn = true;
      authUser = authUser;   
   });

   // return some functions to expose the variables above
   return {
      getIsLoggedIn: function() {
         return isLoggedIn;
      },
      getAuthUser: function() {
         return authUser;
      }
   }
 });

然后在你的控制器中......

app.controller('foo', function($scope, $log, FireBaseService){
   if (FireBaseService.getIsLoggedIn()){
      $log.info(FireBaseService.getAuthUser().Name);
   }
});

这使您可以在您注入 FireBaseService 服务的任何地方访问这些变量。

于 2013-06-22T00:33:50.340 回答