2017-04-27 12 views
2

これは、再度ExpressionChangedAfterItHasBeenCheckedErrorに関連しています。バインディングテンプレートの角の前の遅延

私の状況では、私はajax呼び出しから回復するパラメータ 'data'を持っています。 このデータは、@inputディレクティブを使用して子を作成するために使用されます。私はバインディングがデータが定義されている場合にのみ発生することを望みます。それが動作する方法は、角度は、私は理由を理解ExpressionChangedAfterItHasBeenCheckedErrorを、表示されますが、行われるコールバックとデータを待つために、角依頼する方法をので、私は

export class UserComponent{ 
    data: any 


    constructor(
     private userService: UserService){ 
      this.userService.getUser() 
      .subscribe(result => { 
       this.data = result; 
      } 
     } 
    ); 
} 

角度であることを行うにはどのよう見当がつかないto be!=バインディングを開始する前に未定義からのものですが、目標はデータベースからの実際の値で初期化された子を持つことです。

"実際の"データをバインドする前にサイクルの終了を待つ必要がある場合は、このエラーが発生しないようにしてください(そして、setTimeoutを使用しないでください)。

おかげ

<!--the template if it matter --><somechildtag [data]="data" ></somechildtag> 
+0

httのすべての回答p://stackoverflow.com/questions/39787038/how-to-manage-angular2-expression-has-changed-after-it-was-checked-exception-w私のシナリオでは役に立たなかった:s – ssbb

+0

あなたは再現できますか?プランカで? –

答えて

2

ng-containerを使用してコンポーネントをロードします。例えば

:あなたのdataオブジェクトがを移入された場合にのみ

<div *ngIf="data?.length > 0"> 
     <ng-container *ngComponentOutlet="myChildComponent; 
       ngModuleFactory: childComponentsModule;"></ng-container> 
    </div> 

だから、あなたはあなたの子供をレンダリングします。あなたのコンポーネントで

private childComponentsModule: NgModuleFactory<any>; 

constructor(private compiler: Compiler){ 
    this.childComponentsModule = compiler.compileModuleSync(ChildComponentsModule); 
} 

あなたがここに動的にコンポーネントをロードする方法のより詳細な例を見ることができます:

Angular2: Use Pipe to render templates dynamically

角度のマニュアル:

https://angular.io/docs/ts/latest/api/common/index/NgComponentOutlet-directive.html

+1

前にこのngcomponentOutletを見ない、別のリンクのためにありがとう – ssbb

+0

@ssbb問題のない男。私はそれを発見して以来、私の人生を救った非常に柔軟なソリューションです!動的なフォーム入力、動的なメニューオプションなどをレンダリングしています...私の意見では非常に強力なツールです。あなたのプロジェクトに幸運を祈る! ;) – SrAxi

関連する問題