2013-10-31 153 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, ...); 
});