将HTTP服务注入异步创建的服务?

时间:2016-03-28 08:27:44

标签: angular

我有以下问题:

由于我的页面非常庞大,我只想按需加载服务,即当有人到达某个URL时,我有一条异步路由然后按需加载创建我的视图组件和服务。它适用于组件,但依赖注入给我一个问题:

如果我只是将新创建的服务注入组件,那么它会创建多个服务实例(每个组件一个)。这是因为我不能将所有组件都放在父组件的子组件中,而只是在那里providers:[myService],但我必须为每个独立组件执行此操作。

我的解决方案"对于那个问题是不使用NG2依赖注入,而是做我自己的简单:

let LayoutServiceClass = ng.core
    .Class({
        constructor: [ng.http.Http, function(http) {

        }]
    });

let LayoutService = new LayoutServiceClass();

现在,虽然这种方法有效,但它带来的问题是我在服务中没有DI,即上面的Http没有被注入。由于我必须手动注入这些依赖关系和依赖关系,因此手动注入它(new ng.http.Http())结果太复杂且不安全。依赖性。

另一方面,我尝试为该服务使用自定义注入器(有些根据https://angular.io/docs/js/latest/api/http/Http-class.html):

let injector = ng.core.Injector.resolveAndCreate([
    ng.http.HTTP_PROVIDERS,
    ng.http.Http
]);

this.http = injector.get(ng.http.Http);

但是EXCEPTION: Tried to get instruction before the type was loaded.

失败了

编辑:在超时时使用injector.get,即

window.setTimeout(() => {
    this.http = injector.get(ng.http.Http);
});

解决了这个错误,但仍然提出了Error: No provider for ConnectionBackend! (Http -> ConnectionBackend)

我该如何正确地做到这一点?

1 个答案:

答案 0 :(得分:0)

好吧看起来我用以下方法解决了它:

let injector = ng.core.Injector.resolveAndCreate([
    ng.http.HTTP_PROVIDERS,
    ng.core.provide(ng.http.ConnectionBackend, {useClass: ng.http.XHRBackend}),
    ng.http.Http,
    LayoutServiceClass,
]);

let LayoutService = injector.get(LayoutServiceClass);

我仍然愿意接受比这更好的解决方案!