【发布时间】:2017-05-02 09:35:43
【问题描述】:
我正在向您寻求帮助,请教您在这里使用什么方法:我已经测试了很多东西来解决我的问题,并且我至少有 4 个可行的解决方案,但我不知道哪一个是最有效的最好的,如果其中一些只是因为我做过的其他事情的副作用而起作用,不应该使用......
我在文档中找不到任何内容来指向这些解决方案之一(或另一个)
首先,这是我的情况:我正在构建一个应用程序,它连接到数据 API 并构建不同的部分,每个部分都包含 dataviz。
我将网站的各个部分构建为模块,但它们共享一个名为 DataService 的服务(这些模块中的每一个都将使用 DataService 来获取和处理数据)。
我的 DataService 需要一个配置文件,其中包含许多特定于每个部分的选项并存储在它自己的文件夹中。
所以我需要在 module.ts 文件的 providers 部分中为每个部分单独提供 DataService,避免将 DataService 复制到每个模块似乎是一种好习惯......
所以文件的架构是:
--Dashboard module
----data.service.ts
----Section1 module
------Section1 config file
----Section2 module
------Section2 config file
我尝试了多种似乎都可以在部分模块文件中工作的东西:
解决方案一:注入
(即使我没有在任何地方看到这个,我也无法在没有引号的情况下使注入工作)
模块文件:
import { DataService } from '../services/data.service';
import viewConfig from './view.config.json';
@NgModule({
imports: [ ... ],
declarations: [ ... ],
providers: [
{ provide: 'VIEW_CONFIG', useValue: viewConfig },
DataService,
]})
export class Section1Module { }
部分文件:
@Injectable()
export class DataService {
constructor(@Inject('VIEW_CONFIG') private viewConfig : any) {}
}
解决方案 2:工厂供应商
ng serve 重启后无法正常工作(请参阅更新)
灵感来自https://angular.io/docs/ts/latest/guide/dependency-injection.html#!#factory-provider
模块文件:
import { DataService } from '../services/data.service';
import viewConfig from './view.config.json';
export let VIEW_CONFIG = new InjectionToken<any>('');
let dataServiceFactory = (configObject):DataService => {
return new DataService(configObject)
}
@NgModule({
imports: [ ... ],
declarations: [ ... ],
providers: [
{ provide: VIEW_CONFIG, useValue: viewConfig },
{
provide : DataService,
useFactory : dataServiceFactory,
deps : [VIEW_CONFIG]
},
]})
export class Section1Module { }
部分文件:
@Injectable()
export class DataService {
constructor(private viewConfig : any) {}
}
解决方案 3:直接实例化的自定义提供程序
ng serve 重启后无法正常工作(请参阅更新)
模块文件:
import { DataService } from '../services/data.service';
import viewConfig from './view.config.json';
@NgModule({
imports: [ ... ],
declarations: [ ... ],
providers: [
{ provide: DataService, useValue : new DataService(viewConfig) },
]})
export class Section1Module { }
部分文件:
@Injectable()
export class DataService {
constructor(private viewConfig : any) {}
}
解决方案 4:带工厂的自定义提供程序
ng serve 重启后无法正常工作(请参阅更新)
非常类似于解决方案 3...
模块文件:
import { DataService } from '../services/data.service';
import viewConfig from './view.config.json';
let dataServiceFactory = (configObject) => { return new DataService(configObject) }
@NgModule({
imports: [ ... ],
declarations: [ ... ],
providers: [
{ provide: DataService, useValue : dataServiceFactory(viewConfig) }
]})
export class Section1Module { }
部分文件:
@Injectable()
export class DataService {
constructor(private viewConfig : any) {}
}
解决方案 5 使用从服务文件 AND 和注入令牌导出的工厂
模块文件:
export const VIEW_CONFIG = new InjectionToken<any>('');
@NgModule({
imports: [ ... ],
declarations: [ ... ],
providers: [
{ provide: VIEW_CONFIG, useValue: viewConfig },
{ provide : DataService,
useFactory: dataServiceFactory,
deps : [VIEW_CONFIG] }
]})
export class Section1Module { }
部分文件:
@Injectable()
export class DataService {
constructor(private viewConfig : any) {}
}
export function dataServiceFactory(configObject) {
return new DataService(configObject);
}
我愿意接受任何关于“什么是正确的解决方案?”的批评、想法和任何形式的新领导。甚至“这些解决方案是正确的吗?”
非常感谢! :D
更新 有一次,我意识到我的 Angular-CLI 行为异常,如果我杀死本地服务器并执行“ng serve”,其中一些方法将不起作用。 更奇怪的是,杀死 CLI 本地服务器并重新启动它后,它就不起作用了,但是下次我保存文件并重新编译 CLI 时,它就可以正常工作了……
解决方案 1:仍在工作
解决方案 2 / 解决方案 3:失败并出现错误:
Error encountered resolving symbol values statically. Calling function
'DataService', function calls are not supported. Consider replacing the
function or lambda with a reference to an exported function
解决方案 4:失败并出现错误:
Error encountered resolving symbol values statically. Reference to a non-exported function
添加解决方案 5
【问题讨论】:
-
问题不是我的用例,而是答案为我指明了正确的方向。