Angular - 模块化地定义所有服务

时间:2015-09-11 14:26:56

标签: javascript angularjs

说我有像这样的服务模块

// services/someService.js
export default function($q) {
  return $q.doSomething();
}

// services/anotherService.js
export default function($state) {
  return $state.doAnotherThing();
}

并说我有一个服务索引文件

// services/index.js
import someService from 'someService';
import antoherService from 'anotherService';

export default {
  someService: someService,
  anotherService: anotherService,
}

在我的角度模块中,我希望能够注册所有这些(雄辩地)。

// awesomeModule.js
import services from './services';

angular.module('awesomeModule', [])
.services(services); // Want to emulate something like this

我很难找到一个很好的方法来注册索引模块,这样我就可以防止在awesomeModule中单独注册每个服务。有什么办法吗?

*编辑*

使用@ sdgluck的建议我创建了一个实用程序函数/模块来向模块注册任意服务类型。

// utils.js
export function register(module, type, modules) {
  for (let extension in modules) {
    module[type](extension, modules[extension]);
  }
}

在我的主模块文件中,我包含了实用程序和注册服务类型,如此。

// main.js
import {register} from './utils';
register(angular.module('awesomeModule'), 'service', services);

1 个答案:

答案 0 :(得分:3)

你不能在Angular中“批量”注册模块。但是,使用forEach, arrow functions, and destructuring,您可以在一行中非常干净地注册每个导入。

首先重构如何将服务导出到以下对象数组模式:

export default [
    { 
        name: "someService",
        fn: someService
    },
    { 
        name: "anotherService",
        fn: anotherService
    }
]

然后使用这样的导出:

// awesomeModule.js
import services from './services';

let app = angular.module('awesomeModule', []);

services.forEach(({name, fn}) => app.service(name, fn));

这将产生与您执行以下操作相同的结果:

services.service('someService', services.someService);
services.service('anotherService', services.anotherService);
// and so on...