2013-06-21 63 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

相關問題