2014-06-30 61 views
0

我有一個用.NET編寫的自定義Web API,它返回將在我的AngularJS應用程序中使用的用戶信息。我希望能夠調用我的API一次,然後在整個AngularJS應用程序中使用返回的JSON,而不必在每個控制器中調用API。僅使用一次調用即可跨所有控制器使用角度服務資源的返回數據

我目前有一個服務工廠,其中一個返回客戶端的所有詳細信息,我需要在其餘服務中使用。

.factory('customApiService', function ($resource) { 
    return { 
     userInfo: function(userId, callback){ 
      var api = $resource('../../api/UserInfo/:userId', { 
       userId: userId 
      }, { 
       fetch: 'JSONP', 
       'query': { isArray: false } 
      }); 

      api.fetch(function (response) { 
       callback(response); 
      }); 
     } 
    } 
) 

現在我不想在每一個控制器來調用這個服務用戶信息,但我不希望數據被傳遞到每一個不叫我的API多次。

customApiService.userInfo(userId, function (d) { 
    var gaProfileId = d.gaProfileId; 
    var yelpId = d.yelpId; 
    var tripAdvisorId = d.tripAdvisorId; 
    var facebookPageName = d.facebookPage; 
    var twitterHandle = d.twitterHandle; 
    var clientName = d.clientName; 
    var searchlightAccountId = d.searchlightAccountId; 
    var searchlightDomain = d.searchlightDomainId; 
} 

回答

0

您可以嘗試全局變量。

使用$ rootScope https://docs.angularjs.org/guide/scope $ rootScope在所有控制器中都可用模板。只需在控制器或需要的地方注入$ rootscope。

+0

其實我有$ rootScope注入的另一個原因是在那一刻,但如果/當我把這種服務的任何其他控制器之前自動加載到$ rootScope啓動?我需要確保在繼續應用程序的其他部分之前先設置這些變量。 –

+0

爲什麼不在應用程序運行中執行它 –

+0

如果需要比其他服務調用更長的時間才能完成,是否會遇到任何計時問題? –

0

從我讀到的描述和對其他問題的回答中,聽起來好像你正試圖在應用程序的其餘部分啓動之前進行異步調用。這是可能的,但複雜的,首先是Angular的缺點。在我看來,你有兩個選擇:

  1. 快速HACK:如果你真的想這樣的行爲,爲什麼在所有啓動的應用程序?在首先定義你的應用程序之前先做好你的請求,然後在請求的結果處理程序中定義你的應用程序。

  2. 正確的方法:改變您的服務和控制器的行爲,以容忍沒有足夠的信息來完全啓動。很多時候這比聽起來難。通常,您可以將承諾鏈接到其初始化代碼塊中,以等待所需的數據。看看布賴恩·福特的「角模態」的項目,在我在這裏強調的代碼行:

    https://github.com/btford/angular-modal/blob/master/modal.js#L25-L36

    這種技術建立了一個承諾,從函數返回。如果它需要的數據已經從服務中加載,它立即解決承諾。否則,它會調用它以獲取它後面的內容,稍後可以看到該模塊使用promise.then()等待,直到它具有需要運行的數據。

    對於使用異步數據的控制器和服務來說,這是一個很好的模式。

如果使用$ resource調用,請注意大多數$ resource調用會在名爲$ promise的屬性中返回一個promise。你可以做這樣的事情:

var MyController = function($scope) { 
    // This will get set soon! 
    $scope.myData = null; 


    var myResource = $resource('/path/to/:someId', { someId: '@id' }); 
    myResource.get({ someId: 1 }).$promise.then(function(data) { 
      $scope.myData = data; 
    }); 
}; 

您可以承諾做更多的事情的。那麼()號決議的回調,像初始化控制器等多個部分也有可以延遲開始你的方式整個控制器,直到資源可用。一個非常酷的方法是,如果你碰巧使用Angular UI路由器模塊,定義每條路由時有一個「解決方案」選項。你可以使用它來調用$ resource,如上所示,並且ui-router將等待啓動你的控制器/視圖,直到它具有它所需要的。

+0

我想要做第二個選擇,但有沒有什麼辦法通過$ resource調用而不是$ http做出承諾。我似乎無法找到任何信息。 –

相關問題