通过应用程序配置AngularJS实现动态提供程序选项

5

我有提供程序模块,可以接受以下配置:

angular.module('app', ['search']).
  config(['$searchProvider', function($searchProvider) {
    $searchProvider.options({
      resultLimit:50,
      defaultSort:'highToLow'
    });
  }]);

每个客户端将有一个新的应用程序实例,因此我正在考虑使用客户自助门户来配置元对象。
这意味着提供者模块现在需要坐在回调方法中等待元,然后才能设置它们各自的配置。
但是让我们都记住:配置块 - 在提供者注册和配置阶段执行。只有提供者和常量可以注入到配置块中。这是为了防止服务在完全配置之前被意外实例化...
...所以文档说您可以在配置块中使用提供者,但我不确定您是否可以使用它们进行服务调用。因为我不知道如何正确处理这个问题,所以我会向您展示我的“高级”想法:
使用另一个提供程序回调包装依赖提供程序:
angular.module('app', ['search','meta']).
  config(['$searchProvider','$metaProvider', function($searchProvider, $metaProvider) {
    $metaProvider.get(function(meta){
      $searchProvider.options(meta);
    });
  }]);

如何最好地处理这个问题?


你不能只是从你选择的服务器端语言中将配置以JSON格式在页面加载时转储出来吗? - Jani Hartikainen
@JaniHartikainen 单页应用程序。不存在。 - Dan Kanze
如果您的提供者正在等待异步数据,就像@JaniHartikainen指出的那样,那么您应该真正考虑将这些数据引导到HTML中。另一方面,如果您的用户可以等待您的应用程序完全配置好,那么您可以手动引导Angular。在应用程序引导后,无法重新配置提供者。我只是好奇 - 为什么不使用普通服务而不是提供者? - g00fy
@g00fy 提供者是包含多个方法的模块。有几个自定义配置。目前我正在考虑在我的应用程序级控制器内将它们包装在回调函数中。实例化它们的成本/开销很小,API 调用可以稍后在子控制器级别根据需要进行。 - Dan Kanze
@DanKanze,你想让你的提供程序是异步的吗?我猜如果你正在使用回调函数,那么是的。唯一的问题在于,提供程序应该是同步的,因为你需要在实际运行之前配置你的应用程序。这样做非常有意义。 - g00fy
@g00fy 是的,你说得对 --- 控制器无法限定提供者方法/数据,因为它们还没有从回调中配置。我不知道我要如何在框架的限制内解决这个问题。如果你有一个可以引导 Angular 客户端的解决方案,我真的很想看看。 - Dan Kanze
1个回答

3

我最近也遇到了同样的问题。我无法找到在框架范围内解决问题的方法,所以我通过在加载所有客户端配置信息后手动引导 Angular 来解决问题。http://docs.angularjs.org/api/angular.bootstrap

$.get('/api/context', function () {
    // ...
    angular.bootstrap($('#container'), ['app']);
});

$.get 不可用,但 Angular 的全局 API 可以使用,是吗?我需要包含 jQuery 或自己编写 XHR 来进行 GET 请求,对吗? - Dan Kanze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接