2016-01-11 9 views
5

コンポーネントが動的にロードされると、テンプレート内のバインディングが一切動作しないという問題が発生します。これと同様に、ngOnInitメソッドはトリガされません。動的にロードされたコンポーネントでバインディングが機能しない

loadView() { 
    this._dcl.loadAsRoot(Injected, null, this._injector).then(component => { 
     console.info('Component loaded'); 
    }) 
    } 

動的にロードされたコンポーネント

import {Component, ElementRef, OnInit} from 'angular2/core' 

declare var $:any 

@Component({ 
    selector: 'tester', 
    template: ` 
     <h1>Dynamically loaded component</h1> 
     <span>{{title}}</span> 
    ` 
}) 

export class Injected implements OnInit { 

    public title:string = "Some text" 

    constructor(){} 

    ngOnInit() { 
     console.info('Injected onInit'); 
    } 

} 

これは私が間違ってそれを実装しようとするかもしれないと思う動的にロードされたコンポーネントを使用して、私の最初の時間です。

ここには、問題を示すplunkrがあります。どんな助けもありがとう。

+2

知られている[問題](https://github.com/angular/angular/issues/6223が) 'loadAsRoot'であります。今のところ最も安全な方法は 'loadNextToLocation'か' loadIntoLocation'です。 –

+0

@EricMartinezロードしようとしているコンポーネントはモーダルダイアログです。私がそれを読み込もうとしているコンポーネントは、 'fixed' CSSスタイルの要素の中にあるので、ダイアログは' body'タグの最初の子としてかなり読み込まれる必要があります。深くネストされたコンポーネントの中から 'loadNextToLocation'または' loadIntoLocation'を使ってこれを行うことはできますか? – garethdn

+0

純粋なCSSで修正できると思います。すべての位置を0(上端、左端、右端、下端)に設定し、固定位置と高いz-インデックス値に設定すると、読み込まれる場所に応じてモーダルダイアログを表示できます。 –

答えて

6

Eric Martinezは、loadAsRootの使用に関連する既知のバグであることを指摘しました。推奨される回避策は、loadNextToLocationまたはloadIntoLocationを使用することです。

私が動的にロードしようとしていたコンポーネントは、fixedcssの位置付けを持つコンポーネント内部からのモーダルダイアログだったので、これは問題でした。私はまた、どのコンポーネントからモーダルをロードし、それが動的にロードされたコンポーネントに関係なくDOMの同じ位置に注入する機能を望んでいました。

私の解決策は、forwardRefを使用して、自分のモーダルを動的にロードするコンポーネントにルートAppComponentを注入することでした。

を:私は今、呼び出すことができます戻る私の他のコンポーネント(私は動的にモーダルをロードしたい1)中のアプリの ElementRef

@Component({ 
    selector: 'app', 
    template: ` 
     <router-outlet></router-outlet> 
     <div #modalContainer></div> 
    `, 
    directives: [RouterOutlet] 
}) 

export class AppComponent { 

    constructor(public el:ElementRef) {} 

    getElementRef():ElementRef { 
     return this.el; 
    } 

} 

を返すメソッドを持っている私のAppComponent

constructor (
    ......... 
    ......... 
    private _dcl: DynamicComponentLoader, 
    private _injector: Injector, 
    @Inject(forwardRef(() => AppComponent)) appComponent) { 

    this.appComponent = appComponent; 
} 

this._dcl.loadIntoLocation(ModalComponent, this.appComponent.getElementRef(), 'modalContainer').then(component => { 
    console.log('Component loaded') 
}) 

これはおそらく同様の問題を持つ他の人に役立つでしょう。

+0

を行います。問題は、私はこれを2回呼び出したときに、コンポーネントが以前に作成したコンポーネント(一番上に最新のコンポーネント)とスタックされます、です。私が欲しいのは二回目の呼び出しは、以前のコンポーネントを交換します 'loadAsRoot'の行動のようなものです。 は手動でクリーンですか'loadIntoLocation'秒の時間を呼び出す前にDOM?私はInject'のドキュメント@'見つけるのですか?角度2つのドキュメントではまだ利用できません – Kurotsuki

+0

... – Sebastian

+0

は、子コンポーネントは、負荷をしましたが、動的にロードされたコンポーネントのngOnInitまたはngAfterViewInit方法私がmousemoveをするときにのみ呼ばれた。あなたはこの問題に直面していますか? – Sanjeev

0

DOMからコンポーネントインスタンスを削除する必要はありません。 コンポーネントインスタンスを作成して削除するには、angular2/coreパッケージの 'componentRef'を使用します。 モーダルコンポーネントを目的の場所にロードするにはshow()を使用し、loadIntoLocationを2回呼び出す前にhide()を使用してコンポーネントインスタンスを破棄します。例えばのための

@Component({ 
    selector: 'app', 
    template: ` 
    <router-outlet></router-outlet> 
    <div #modalContainer></div> 
`, 
    directives: [RouterOutlet] 
}) 
export class AppComponent { 
    private component:Promise<ComponentRef>; 

    constructor(public el:ElementRef) {} 

    getElementRef():ElementRef { 
    return this.el; 
    } 

    show(){ 
    this.component = this._dcl.loadIntoLocation(ModalComponent,this.appComponent.getElementRef(), 'modalContainer').then(component => {console.log('Component loaded')}) 
    } 

    hide(){ 
    this.component.then((componentRef:ComponentRef) => { 
     componentRef.dispose(); 
     return componentRef; 
    }); 
    } 
} 
関連する問題