2017-04-27 125 views
2

這與ExpressionChangedAfterItHasBeenCheckedError再次有關。綁定模板角度前的延遲

在我的情況,我有一個參數'數據',我從ajax調用恢復。 此數據用於通過@input指令創建子項。我希望綁定只發生在定義數據時。但我不知道怎麼做,與角

export class UserComponent{ 
    data: any 


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

,因爲它的工作方式,角度會顯示一個ExpressionChangedAfterItHasBeenCheckedError,我明白爲什麼,但怎麼問的角度,以等待回調做和數據在啓動綁定和東西之前,從未定義的開始,目標是讓一些孩子用來自數據庫的真實值進行初始化。

如果我在綁定「真實」數據之前應該等待週期的結束,那很好,但是如何在沒有這個錯誤的情況下做到這一點(並且請不要使用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

您可以重現在Plunker? –

回答

2

ng-container裝入組件。

例如:

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

所以,你會渲染你的孩子只有當你的data對象是填充

在您的組件:

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