如何在Angular2中手动强制重新渲染组件?

5
我正在使用ng Smarttable,并通过事件更改数据源数组(更改是数组内某个值的id更改)。问题是angular没有检测到这些更改,除非我悬停在页面上或点击某个地方,否则什么也不会发生。
所以更改在后台被正确应用,当我点击某个地方时才会"看到"这些更改。
因此,我可以手动点击很多次来查看属性的更改,但这是不希望的。
我尝试过:
1. 在更改数组的函数中使用ChangeDetectorRef(markAsChanged & DetectChange)
2. 一旦数组更改,手动创建一个单击事件
3. 使用Immutability(this.data = [...this.data];)
是否有可能像这样做?
this.renderer.refresh();

或者只使用ng smartable的功能?

编辑:看起来问题出在我这里。当你“刷新”smarttable时,你会得到一个承诺,在加载完成后才执行一次。

我没有使用过这个承诺。将普通的DetectChange()放在承诺里使它能够工作。


1
你尝试过不可变性吗?例如,当你改变数据源时,如果你有一个名为data的数组,请在事件监听器中写入以下代码:this.data = [...this.data] - Mehdi Benmoha
是的,它不起作用。 - Loading
你能否在这里或者Stackblitz上发布你代码的片段,并告诉我们当前和期望的行为? - TheLebDev
很不幸,我认为这是不可能的,因为这是来自工作代码。 - Loading
1
你尝试过使用ng2-smarttable的刷新方法吗:https://github.com/akveo/ng2-smart-table/issues/109# 或者查看他们的文档。 - Mehdi Benmoha
是的,但问题出在我这边。请查看编辑以获取解决方案。 - Loading
1个回答

8

您可以使用应用程序引用手动重新渲染。

将ApplicationRef注入到您的组件中。

constructor(appRef: ApplicationRef) {}

每当需要重新渲染时,请调用tick方法

appRef.tick();

1
针对库特定的解决方案,请查看此主题。 https://github.com/akveo/ng2-smart-table/issues/718 - Dulanjaya Tennekoon
@加载很好。但是对于你提出的问题,如何进行手动重新渲染,这就是答案。 - Dulanjaya Tennekoon
1
太棒了!简短明了,非常感谢! - Nexonus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接