2013-03-07 43 views
4

我想在一個Angular項目中包含Facebook JavaScript庫,這樣所有的Facebook API調用(登錄,註銷等)都被封裝在一個服務中。但由於FB庫的異步特性,我的代碼看起來過於冗長,而且我有幾次調用$ rootScope.apply(),我不確定這是最佳實踐。如何在角度中包含Facebook JS庫?

現在,我有這樣的事情:

app.factory('Facebook', function($rootScope, $window, $q){ 
    var FBdefer = $q.defer(); 
    var FBpromise = FBdefer.promise; 
    $window.fbAsyncInit = function(){ 
    $rootScope.$apply(function(){ 
     FB.init(/* FB init code here*/); 
     FBdefer.resolve(FB); 
    } 
    } 

    var fb_service_api = { 
    login: function(){ 
     var deferred = $q.defer(); 
     FBPromise.then(function(FB){ 
     FB.login(function(response){ 
      $rootScope.$apply(
      deferred.resolve(response) 
     ); 
     }); 
     } 
     return deferred.promise. 
    } 
    } 

    return fb_service_api; 
}) 

尋找有好的設計模式與框架的角度非常適合。

回答

0

我認爲你可能可以通過使用Misko Hevery's approach here解決這個問題來延遲加載你的控制器,直到Facebook的XHR呼叫「解決」爲止。

這似乎解決了我的所有異步數據加載問題,並可能意味着您可以刪除您的$apply()調用。

+0

我的問題是,我的頁面的其餘部分不需要等待fb庫在頁面開始呈現之前加載。我在想頁面可以異步加載和渲染FB組件。 – sthomps 2013-03-13 15:16:20