Próbuję wczytać dynamicznie komponent w ostatecznej wersji 2.0.0.Dynamiczne ładowanie istniejących komponentów Angular 2 Final Release
Korzystanie RC5 byłem ładowanie za pomocą następującego kodu:
Tworzenie dyrektywę załadować formantów:
import {
CheckboxComponent, CheckboxListComponent,DatePickerComponent
} from '../components/';
@Directive({
selector: '[ctrl-factory]'
})
export class ControlFactoryDirective implements OnChanges {
@Input() model: any;
constructor(private vcRef: ViewContainerRef, private resolver: ComponentResolver) {
}
create(cp) {
this.resolver.resolveComponent(cp)
.then(factory => {
const injector = ReflectiveInjector.fromResolvedProviders([], this.vcRef.parentInjector);
this.vcRef.createComponent(factory, 0, injector, []);
let ch = this.vcRef.createComponent(factory, 0, injector, []).instance;
ch.model = this.model;
});
}
ngOnChanges() {
if (!this.model) return;
switch (this.model.type) {
case 'checkbox':
this.create(CheckboxComponent);
break;
case 'checkboxlist':
this.create(CheckboxListComponent);
break;
case 'datepicker':
this.create(DatePickerComponent);
break;
default:
break;
}
}
}
następnie ładowane tę dyrektywę w moją stronę tak:
<div ctrl-factory *ngFor="let child of page.childrens" [model]="child"></div>
Ale po aktualizacji z wersji rc5 do wersji 2.0.0, resolver już nie istnieje, został zastąpiony przez kompilator.
Znalazłem mnóstwo miejsc pokazujących, jak załadować go za pomocą różnych kodów, ale wszystkie te zbyt skomplikowane i nie mogłem sprawić, by działało.
Weź to na przykład: How can I use/create dynamic template to compile dynamic Component with Angular 2.0?
Wygląda bardziej specyficzne dla tego scenariusza, My One po prostu trzeba załadować składnik i ustawić @Input nazywany modelem.
Jedną rzeczą, gdy próbowałem, musiałem stworzyć dynamicznie moduł dla każdego komponentu, a następnie dodać do niego komponent. Ale wtedy miałem problemy z powiedzeniem, że komponent był ustawiony w więcej niż jednym module, spróbuj usunąć w pewnym miejscu nie działa.
Główną część kodu pokazanego, mam z tego linku: http://blog.lacolaco.net/post/dynamic-component-creation-in-angular-2-rc-5/
i zrobił kilka zmian.
Aktualizacja
udaje mi się zrobić to praca, stosując następujące metody:
Sposób tworzenia została zmieniona na
private create(cp) {
@NgModule({
imports: [BrowserModule, ControlsModule],
declarations: []
})
class DynamicModule {}
this.compiler.compileModuleAndAllComponentsAsync(DynamicModule)
.then(({componentFactories}) => {
const compFactory = componentFactories.find(x => x.componentType === cp);
const injector = ReflectiveInjector.fromResolvedProviders([], this.vcRef.parentInjector);
const cmpRef = this.vcRef.createComponent(compFactory, 0, injector, []);
cmpRef.instance.model = this.model;
});
}
Większość miejsc znalazłem, set utwórz komponent i ustaw go na DynamicModule, problem z tym, że już deklarujesz ten sam komponent w innym module, kątowy będzie komp leżeć wokoło. Rozwiązaniem w moim przypadku było zaimportowanie mojego modułu ControlsModule, który eksportuje wszystkie moje formanty.
Próbuję stworzyć coś podobnego. Mam plik JSON, który ładuje klasy i ich listę wykładów. Klasy są dodawane do paska nawigacji, a wykłady są dodawane jako lista w widoku szczegółowym. Po kliknięciu wykładu komponent powinien zostać załadowany w widoku szczegółów. Dla każdego wykładu istnieje inny komponent i zastanawiałem się nad utworzeniem modułu lub łącza routera dla każdego wykładu (i gniazda routera), zamiast po prostu ładować komponent, jak na przykład. Wciąż próbuję znaleźć najlepszy sposób ładowania rzeczy. – Atieh