async/await 防止 Angular2 在模板语句中使用时渲染组件

Posted

技术标签:

【中文标题】async/await 防止 Angular2 在模板语句中使用时渲染组件【英文标题】:async/await prevents Angular2 from rendering the component when used in template statement 【发布时间】:2016-07-10 08:28:43 【问题描述】:

单击组件的按钮时将执行以下方法。

async onClickButton() 
    await this.shoppingCartService.add(this.selectedOffer);
    this.router.navigate(['ShoppingCartComponent']);

数据将被添加到购物车中,但在导航到下一页时,只会呈现标题,而不会呈现数据。此方法有效,如果不使用 async-await,将正确呈现以下页面。 使用 ChangeDetectorRef.detectChanges() 和 ApplicationRef.tick() 强制更改检测无效。 离开下一页,即 ShoppingCartComponent 后,将进行渲染,并且会显示一会儿数据。 有什么想法会出什么问题吗?

【问题讨论】:

你在 Angular 2.4.8 中试过了吗?? ..因为在 2.4.4 中它对我有用..现在我将 Angular 更新到 2.4.8 ..它不再工作(只有 this.ngZone.run .. 但它很烂!!) 【参考方案1】:

这是async/await 的已知问题。它会导致 await 之后的代码不在 Angulars 区域内运行。

作为解决方法,您需要在构造函数中注入 NgZone 并将代码更改为

async onClickButton() 
    await this.shoppingCartService.add(this.selectedOffer);
    this.ngZone.run(() => 
      this.router.navigate(['ShoppingCartComponent']);
    );

另见https://github.com/angular/angular/issues/322

【讨论】:

现在在 Angular v2.4.4+ 中可以正常工作(没有 ngZone.run)。 @RodolfoJorgeNemerNogueira 感谢您的反馈。哇,我见过的最长的 SO 用户名:D 嗨..有可能重新开始在 Angular 2.4.8 中不起作用?? ..因为在 2.4.4 中它正在工作..现在我更新了 angular..并且再次仅适用于 this.ngZone.run :-( ..sich!! “重新开始”是什么意思?你的意思是它又停止工作了吗? 是的! ...我已将 angular 更新到 2.4.8 并将 node.js 更新到最新(7.6.0)

以上是关于async/await 防止 Angular2 在模板语句中使用时渲染组件的主要内容,如果未能解决你的问题,请参考以下文章

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题

如何在 componentWillUnmount 中中止运行 async/await xmlHttpRequest?

浅谈async/await

async/await的使用

如何优雅处理 async await 错误——解读小而美的 awaitjs 库