Angular2,通过 string/name 手动解析类型

Angular2, manually resolve a type by string/name

是否可以仅通过名称手动解析组件?

我有一个包含组件名称的字符串变量,比方说 "UserService"

我需要能够解析这种类型,我查看了 Injctor,我可以从文档中看到 resolve()resolveAndCreate() (https://angular.io/docs/ts/latest/api/core/Injector-class.html)

但我没有类型。

谢谢

史蒂夫

编辑:尝试了以下操作:

System.import("path/to/service").then(p=>{

     var injector = Injector.resolveAndCreate([p[this.serviceName]]);//works

     var serviceInstance = injector.get(p[this.serviceName]); //Fails with "No provider for Http! (UserService -> Http)".


});

我有 Http 可用,它是在 bootstrap 期间提供的,它适用于应用程序的其他部分。

bootstrap(AppComponent, [
    ROUTER_PROVIDERS, Http, HTTP_PROVIDERS, UrlBuilderService,
    provide(LocationStrategy, { useClass: HashLocationStrategy }),
    provide('notification', { useClass: NotificationService })
]);

有什么想法吗?

进一步编辑:

我现在这样称呼 resolveAndCreate

var injector = Injector.resolveAndCreate([p[this.serviceName], Http]);

失败

No provider for ConnectionBackend! (UserService -> Http -> ConnectionBackend)

所以我这样称呼它:

var injector = Injector.resolveAndCreate([p[this.serviceName], Http, ConnectionBackend]);

由于缺少其他一些东西而失败了。

改成了这个

var injector = Injector.resolveAndCreate([p[this.serviceName], HTTP_PROVIDERS]);

现在一切正常。

我不明白的是为什么它没有自动解析这些组件,因为我在 bootstrap 期间提供了它们。

您可以通过使用 system.js(即 angular2 使用的加载程序)来实现此目的:

System.import('path/to/UserService').then(m => 
{
    //Here you can access user service and use it in injector etc.
    Injector.resolveAndCreate([m.UserService]);
});

此技术在这篇文章中得到了很好的说明:Lazy Loading of Route Components in Angular 2

要按名称获取组件,请导入类似

的组件
import * as components from './components'

并使用

访问它们
var componentName = 'SomeComponent';
components[componentName]

另请参阅 Rob Wormald from https://github.com/angular/angular/issues/7596#issuecomment-198199074

中的这个 Plunker

Injector.resolveAndCreate(

您使用传递给 bootstrap(..., [Providers]).
的提供程序创建了一个完全与从 Angular 创建的连接器断开连接的新注入器 以这种方式创建的注入器只能解析传递给 resolveAndCreate().

的提供程序

如果您想使用与您的 Angular 应用程序相同的注入器,那么您需要注入注入器

constructor(private injector:Injector) {
  injector.get(...);
}

您可以根据传递的注入器创建子注入器,并根据需要覆盖绑定。子注入器要么解析为覆盖的绑定,要么在尝试解析请求的依赖项时向上遍历父注入器直到根。