如何在Angular 2

时间:2017-04-14 16:45:38

标签: angular typescript

我有一个服务作为框架的核心,我们将被纳入许多项目。它使用当前静态的密钥将一些数据保存到本地存储。我想将密钥作为参数传入,因此它对于每个项目都是唯一的。这是因为当我从任何这些项目的localhost:4200进行测试时,与本地存储字段/密钥存在冲突。我所拥有的是:

@Injectable()
export class MyService {

private static readonly STORAGE_ID = 'model-data';

     constructor(  ) {

    }

    someFunction() {
        localStorage.setItem(MyService.STORAGE_ID, JSON.stringify(this._model))
    }

}

如何向构造函数添加参数,以便仍然可以通过Angular 2依赖注入实例化它?

1 个答案:

答案 0 :(得分:5)

您可以为密钥提供构造函数参数:

export const STORAGE_KEY = new InjectionToken<string>('storageKey');

@Injectable()
export class MyService {
  constructor(@Inject(STORAGE_KEY) private storageKey: string) { }

  ...
}

然后在providers中,你需要为它提供一个值:

providers: [
  { provide: STORAGE_KEY, useValue: 'this-app-key' },
  MyService,
  ...
]

举例in the DI documentation

或者,创建工厂提供者功能:

export function createServiceFactory(storageKey: string) {
    return () => new MyService(storageKey);
}

并使用:

{ provide: MyService, useFactory: createServiceFactory('that-app-key') }

这样您就不需要@Inject参数。