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(...);
}
您可以根据传递的注入器创建子注入器,并根据需要覆盖绑定。子注入器要么解析为覆盖的绑定,要么在尝试解析请求的依赖项时向上遍历父注入器直到根。
是否可以仅通过名称手动解析组件?
我有一个包含组件名称的字符串变量,比方说 "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(...);
}
您可以根据传递的注入器创建子注入器,并根据需要覆盖绑定。子注入器要么解析为覆盖的绑定,要么在尝试解析请求的依赖项时向上遍历父注入器直到根。