2013-06-21 37 views
1

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

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()中的变量(异步)?

如果我在每个控制器中调用下面的代码,似乎我不断重复自己。

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

UPDATE 这是从哪儿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 
     } 
    }); 
}]); 

回答

0

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

你实际上用$ timeout(function(){...},0)做的事情是迫使代码在下一个digest循环中运行。但我不认为这就是你想要完成的事情。

我不确定'firebaseLoggedIn'在哪里播放;但是您可能会发现整个实施作为Angular Service会更直接。

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服务。

+0

我试过但没有工作。在控制器中'FirebaseService.getIsLoggedIn()'返回false。我认为是因为它没有听取firebaseLoggedIn事件。请再次检查我的问题。我更新了它 – vzhen

+0

尝试更改您的$ rootScope。$ emit到$ rootScope。$ broadcast。 $ emit是通过范围向上调度事件,$ broadcast是向下调度。 –

+0

没有运气,也返回false – vzhen

相关问题