2013-10-31 79 views
0

我是AngularJS的新手,我正在嘗試做一些聽起來有些微不足道的事情,但我正在努力決定什麼是最好的方法。AngularJS中的強制服務初始化

我在AnuglarJS有服務處理所有與我的服務器的REST通信。

爲了避免URL名稱我的客戶機/服務器之間的改變,我創建了一個REST API,它被稱爲get_apis並負責諸如與他們的業間友好的名稱返回我的所有的API函數的數組:

{ 
    'get_user' :'/api/get_user', 
    'delete_user' : '/api/delete_user' 
} 

我遇到的問題是,我的所有其他服務/控制器都依賴於此調用,否則在此調用完成之前,APIS將不能用於其他任何休息操作。

假設我正在對我的API服務構造函數執行get_apis rest操作,其餘的操作仍然是異步的,所以我不能確保我有api。

任何「正確的方法」來做到這一點?也許我重新映射我的url的做法是錯誤的?

回答

1

您可以實現這一目標的一種方法是將啓動時需要服務的組件的代碼包含在函數中(假設它們位於控制器中)。然後你在你提到的API服務構造函數中注入$rootScope$rootScope在啓動時檢索API並使用$broadcast('eventName')發送初始化事件,其他組件(如控制器)可以通過調用其啓動功能在其$on('eventName')中響應。

編輯:這是一個Fiddle,如果我正確理解問題,就可以證明這一點。

+0

謝謝你的小提琴。看起來像一個非常好的解決方案。我可能不會使用它,因爲它會爲如此小的問題造成如此巨大的開銷:)謝謝! –

0

我不知道我完全理解這個問題,但如果你只是想爲您的休息在一箇中心位置調用,以便它們可用於所有的服務,我會做一些像

angular.module('myApp', []) 
    .constant('REST_API_URLS', (function() { 
     return { 
     'get_user' :'/api/get_user', 
     'delete_user' : '/api/delete_user' 
     }; 
    })() 
) 
    .service('MyRESTService', function ($http, REST_API_URLS) { 
    $http.get(REST_API_URLS.get_user) 
    .success() // etc 
    }); 
定義網址
+0

這裏的問題是URL不與我的服務器同步。如果我正在進行服務器更改,它不會消化到客戶端。這是我正在嘗試解決的問題。 –

+0

但是,如果我認爲解決這個問題是一件很痛苦的事情,那麼您的解決方案可能就是我要做的。 –

1

沒有簡單的解決方案,因爲您的應用在正確初始化之前需要進行異步調用。

有幾種解決方案。

  1. 將所需數據注入到應用程序的主模板中。假設您有一個模板index.html,它由您的後端提供,幷包含所有腳本。你的後端可以包含一個腳本和你的api函數。當你想到它時,生產代碼中的api將不會頻繁更改,因此每次啓動應用程序時發出api函數調用都沒有意義。相反,你用你的apis維護一個靜態的.json或.js文件,並將它包含在html本身中。函數名稱將在應用程序啓動時準備就緒。

  2. 在應用程序的.config或.run塊中進行異步調用,延遲所有正常操作,直到獲取api函數列表。這是維護的噩夢,因爲每個使用api的操作都必須首先檢查布爾標誌或監聽事件,或者依靠promise來確保api函數列表已準備就緒。

  3. 使用角度路由機制(我更喜歡ui-state模塊),定義在「/」位置初始化的頂層/ root/main路由或狀態,並添加api函數調用,因爲它在解析列表中依賴。

我真的不知道這是否可能與通用的路由,但與美國,你可以做這樣的事情:

.config(['$stateProvider'], function($stateProvider) { 
    $stateProvider.state('main', { 
     resolve: { 
     apis: ['APIService', function(APIService) { 
      return APIService.getApis(); 
     }] 
     } 
    }).state('someState', { 
     parent: 'main', 
     ... 
    }) 
    ... 
}) 

所有其他國家,將取決於「主」,沒有的它們會在你的api函數列表準備好之前被初始化。

0

另外你應該知道的手動AngularJS引導爲這裏所描述的其他答案:API reference/angular.bootstrap 你可以找到的一些可能性,包括angular.bootstrap here的例子進行比較。

我們使用另一種方法與專用的初始化服務來配置我們的應用程序,並迫使我們的控制器等待其他控制器或服務完成其初始化任務。在我們的blog可以找到非常詳細的說明,並且一些討論已經在AngularJS forum開始。該代碼可作爲jsfiddle,並將看起來像你的控制器裏面:

init('userCtrl', [apiResolutionService.getApiUrls()], function(result) { 
    var apiUrls = result[0].data.apiUrls; 
    var user = $http.get(apiUrls.get_user, ...); 
});