首先,我有一个Context
课程和一个Singleton
。
我希望Context
向Singleton
提供Http和事件的实例。
import { Http } from 'angular2/http';
import { Injectable, Injector, Provider, provide } from 'angular2/core';
import { Events } from 'ionic-angular';
@Injectable()
export class Context{
constructor(private http: Http, private events: Events){}
}
export class Singleton{
private static INSTANCE: Singleton;
private context: Context;
constructor(){
if(Singleton.INSTANCE){
throw new Error();
}
let injector = Injector.resolveAndCreate([
Https,
Events
])
this.context = injector.get(Context);
}
}
但是,当我编译和检查时。 "没有提供商"被提出来了。那么,我怎么能添加提供者呢?
其次,我如何在Singleton
中使用http和事件?我认为this.http
中的Singleton
无效。
答案 0 :(得分:1)
您还需要设置Context
:
let injector = Injector.resolveAndCreate([
Https,
Events,
Context // <-------
])
this.context = injector.get(Context);
}
话虽如此,Angular2将为每个提供商保留一个实例,并且您不需要隐式利用Injector
类。
你不需要SINGLETON课程。您可以将Context
实例直接注入另一个组件或服务:
@Component({
(...)
providers: [ Context ]
})
export class SomeComponent {
constructor(private context:Context) {
}
}
通过在组件的providers
属性中设置提供程序,context
将是组件,其子组件以及它们将调用的所有服务的单例。
如果要为整个应用程序定义单例,请在引导应用程序时指定提供程序:
bootstrap(App, [ Context ]);
请勿忘记从组件的providers
属性中删除。
您还需要注意喷油器与组件相关联。有关详细信息,这个问题可以帮助您:
修改强>
要在Http
课程中使用Singleton
课程,您需要定义HTTP_PROVIDERS
而不是Http
课程:
let injector = Injector.resolveAndCreate([
HTTP_PROVIDERS, // <-------
Events,
Context
])
this.context = injector.get(Context);
this.http = injector.get(Http); // <-------
}
答案 1 :(得分:0)
<强>更新强>
export class Singleton{
private static INSTANCE: Singleton;
constructor(private context:Context){
console.log(context.http);
console.log(context.events);
}
}
<强>原始强>
let injector = Injector.resolveAndCreate([
Https,
Events
])
创建一个新的独立注入器,它只知道提供者Https
和`事件。
您需要注入Angulars注入器,以便能够从bootstrap(...)
constructor(private injector:Injector){
this.context = injector.get(Context);
}