2017-04-27 106 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