最終リリース2.0.0でコンポーネントを動的にロードしようとしています。私は、次のコードを使用してロードされたRC5を使用して既存のコンポーネントを動的にロードする角度2最終リリース
:
は、コントロールをロードするディレクティブを作成します。次に
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;
}
}
}
このように私のページにそのディレクティブをロード:
<div ctrl-factory *ngFor="let child of page.childrens" [model]="child"></div>
をしかし、rc5から2.0.0最終リリースに更新した後、リゾルバはもはや存在せず、コンパイラに置き換えられました。
さまざまなコードを使用してロードする方法を示す場所がたくさん見つかりましたが、すべて複雑すぎて機能しませんでした。
は、例えばこれを持っ:How can I use/create dynamic template to compile dynamic Component with Angular 2.0?
をそれは、私はちょうどコンポーネントをロードし、モデルと呼ば@Inputを設定する必要があり、私の1、そのシナリオに、より具体的に見えます。
私が試していたことの一つは、各コンポーネントのモジュールを動的に作成し、コンポーネントを追加する必要があったことです。しかし、私は、コンポーネントが複数のモジュールに設定されていて、動作していない場所をいくつか削除しようとしているという問題がありました。
示すコードの大部分、私は、このリンクから入手:http://blog.lacolaco.net/post/dynamic-component-creation-in-angular-2-rc-5/
や変更のカップルを行いました。
更新
私は、次のアプローチを使用して、それを動作させるために管理:
作成方法は、私が見つけた
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;
});
}
ほとんどの場所に変更されています、 Componentを作成してDynamicModuleに設定すると、別のモジュールで既に同じコンポーネントを宣言しているときに、angleがcomp約。私の場合のソリューションは、すべてのコントロールがエクスポートされている私のControlsModuleをインポートすることでした。
私は同様のことを作成しようとしています。クラスとその講義リストを読み込むJSONファイルがあります。クラスはナビゲーションバーに追加され、講義は詳細ビューのリストとして追加されます。講義をクリックすると、コンポーネントが詳細ビューにロードされます。各講義ごとに異なるコンポーネントがあり、例のようなコンポーネントをロードするのではなく、各講義(およびルータアウトレット)のモジュールまたはルータリンクを作成することを考えていました。私はまだ物事を読み込むための最良の方法を理解しようとしています。 – Atieh