在Angular 2中使用Injector时没有提供者

时间:2016-06-02 09:00:42

标签: ionic-framework angular ionic2

首先,我有一个Context课程和一个Singleton。 我希望ContextSingleton提供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无效。

2 个答案:

答案 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);
}