我有以下问题:
由于我的页面非常庞大,我只想按需加载服务,即当有人到达某个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)
我该如何正确地做到这一点?
答案 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);
我仍然愿意接受比这更好的解决方案!