【问题标题】:Angular 2: How to inject simple types into your serviceAngular 2:如何将简单类型注入您的服务
【发布时间】:2016-08-05 03:04:08
【问题描述】:

我有一个具有单个字符串参数的基本服务

import {Injectable} from 'angular2/core';
@Injectable()
export class MyService  {
    constructor(someValue: string) {
    }
}

如果我从构造函数中删除字符串参数,服务将很好地注入,但我似乎无法弄清楚如何获取一个简单的字符串来注入。

我已经定义了一个配置来存储应用程序设置

import {OpaqueToken} from 'angular2/core';

export let APP_CONFIG = new OpaqueToken('app.config');

export interface Config {
appSetting: string,

}

export const CONFIG: Config = {
appSetting: "my application nsetting"
};

我为 MyService 定义了一个工厂

import {provide}     from 'angular2/core';
import {MyService} from './my.service';
import {Config, CONFIG}    from './app.config';


let myServiceFactory = (config: Config) => {
return new MyService(config.appSetting);
}

export let myServiceProvider =
provide(MyService, {
    useFactory: myServiceFactory,
    deps: [CONFIG]
});

在我的引导中,我注册了提供者

import {bootstrap} from 'angular2/platform/browser';
import {AppComponent} from './app.component';
import {provide} from 'angular2/core';
import {APP_CONFIG, CONFIG}    from './app.config';
import {myServiceProvider} from './my.service.provider';

bootstrap(AppComponent,
[provide(APP_CONFIG, { useValue: CONFIG }),
 myServiceProvider   
]);

在我的应用组件中,我尝试注入 myService

import {Component} from 'angular2/core';
import {MyService} from './my.service';
@Component({
selector: 'my-app',
template: '<h1>Angular 2 is running</h1>'
providers: [
    MyService
]
})
export class AppComponent {

constructor(private _myService: MyService) {
}
}

应用程序从未启动,我收到此错误

0x800a139e - JavaScript 运行时错误:未捕获(在承诺中):没有字符串提供程序! (AppComponent -> MyService -> 字符串)

【问题讨论】:

  • 为什么不把Config做成类而不是接口,那你就不用OpaqueToken了?您可以只使用 Config 类作为 DI 的键。 OpaqueToken 是一个很好的用例,可以将字符串注入Config(对于appSetting)。

标签: angular angular2-injection


【解决方案1】:

检查此plank,我已尝试修复您的示例。您可以使用 OpaqueTokens 以与 Config 对象相同的方式注入字符串值。

最重要的部分:

deps: [APP_CONFIG]
provide(APP_CONFIG, { useValue: CONFIG })

【讨论】:

  • 那个 plunker 没有使用提供者工厂。我不希望 Config 成为 MyService 中的依赖项,我只希望字符串成为依赖项。因此需要工厂。
  • 做到了..对于我的提供者我有 deps: [CONFIG] 当它应该是 deps:[APP_CONFIG]
猜你喜欢
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
  • 2016-07-15
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多