我在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()
vars有价值之前;
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) {});
更新 这是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 :(得分: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服务的任何位置访问这些变量。