2016-02-16 2 views
2

Можно ли вручную разрешить компонент, зная его имя?Angular2, вручную разрешить тип по строке/имени

У меня есть строковой переменной, которая будет содержать имя компонента, позволяет сказать «UserService»

мне нужно быть в состоянии разрешить этот тип, я смотрел на Injctor, я могу видеть из documenation есть resolve() и resolveAndCreate() (https://angular.io/docs/ts/latest/api/core/Injector-class.html)

, но у меня нет Тип.

Благодаря

Стив

EDIT: попробовал следующее:

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(AppComponent, [ 
    ROUTER_PROVIDERS, Http, HTTP_PROVIDERS, UrlBuilderService, 
    provide(LocationStrategy, { useClass: HashLocationStrategy }), 
    provide('notification', { useClass: NotificationService }) 
]); 

Есть идеи?

Далее Edit:

я теперь называю resolveAndCreate так:

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

, который потерпел неудачу с

Нет провайдера для ConnectionBackend! (UserService -> Http -> ConnectionBackend)

Так я назвал это так:

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

, который не смог с каким-либо другим не хватает материала.

Измененный к этому

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

и теперь все работает.

Я не понимаю, почему это не автоматически разрешает эти компоненты, потому что я предоставлял их во время загрузки.

ответ

4

Вы можете достичь этого, используя систему.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

+0

Благодарим вас за идею, это частично. См. Мой обновленный вопрос для получения дополнительной информации. Спасибо –

5

новый

Чтобы получить компоненты от импорта имя компоненты, такие как

import * as components from './components' 

и доступ к ним с

var componentName = 'SomeComponent'; 
components[componentName] 

Смотрите также это Plunker от Rob Wormald из https://github.com/angular/angular/issues/7596#issuecomment-198199074

старого

С

Injector.resolveAndCreate(

создать новый инжектор, который полностью отсоединен от разъема, созданным с Угловой помощью провайдеры перешли на bootstrap(..., [Providers]).
Инжектор, созданный таким образом, может разрешать только провайдеры, переданные в resolveAndCreate().

Если вы хотите использовать один и тот же инжектор в качестве углового приложения, то вам необходимо придать Инжектор

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

Вы можете создать дочерний инжектор от переданного инжектора и переопределения привязок, если вы хотите. Детский инжектор либо разрешает переопределенные привязки, либо добирается до родительских инжекторов до тех пор, пока не будет исправлен запрос на запросы.

+0

Как я могу сделать 'components [componentName]' в компонент? – Phil

+0

Вам нужно добавить его в 'entryComponents: [...]', тогда вы должны будете создать comonent, как показано в https://stackoverflow.com/questions/36325212/angular-2-dynamic-tabs-with -user щелкните подобранную-компоненту/36325468 # 36325468 –

Смежные вопросы