组件';s视图在Angular2中更新

组件';s视图在Angular2中更新,angular,angular2-template,Angular,Angular2 Template,我正在尝试将Angular2与jQuery+插件结合起来。这基本上是这个问题答案的延伸 我想动态更新所选选择框中显示的项目。Selected已Selected:为此更新了事件设计,但我需要在更新组件视图后触发它,因为Selected只查看元素并基于它们生成其内容 您可以看到现场“工作”演示: 这意味着如果我这样做: this.items.push('Another #' + this.items.length); jQuery(this.el.nativeElement).find('selec

我正在尝试将Angular2与jQuery+插件结合起来。这基本上是这个问题答案的延伸

我想动态更新所选选择框中显示的项目。Selected已
Selected:为此更新了
事件设计,但我需要在更新组件视图后触发它,因为Selected只查看
元素并基于它们生成其内容

您可以看到现场“工作”演示:

这意味着如果我这样做:

this.items.push('Another #' + this.items.length);
jQuery(this.el.nativeElement).find('select').trigger("chosen:updated");
调用
this.items.push()
后,视图未更新,因此它不会执行任何操作

我尝试用
setTimeout
包装
trigger(“selected:updated”)
来异步调用它,我认为这会有所帮助

this.items.push('Another #' + this.items.length);
setTimeout(() => {
    jQuery(this.el.nativeElement).find('select').trigger("chosen:updated");
});
看起来确实有帮助,但我想知道这是正确的方法,还是只是巧合 我原以为在组件的视图更新后可能会调用一些事件,但它们似乎都没有做我需要的事情

编辑:同样的问题在另一个问题中得到了很好的描述:

更新的工作演示:

this.items.push(…)
似乎是由运行在Angulars区域之外的代码调用的。Angular在一个区域内运行,并且在该区域内,大多数异步API都经过修补(事件、setTimeout等),以通知Angular必要的更改检测

如果代码在该区域之外运行,Angular不会收到已完成异步执行的通知,也不会发生更改检测。如果在
setTimeout(…)内运行代码,则在调用完成时将运行更改检测


有关进行角度运行更改检测的其他方法,请参阅。

我认为
this.items.push()
在区域内运行,因为它由
(单击)
事件调用。我以前尝试过使用
NgZone
,但我的用例不同,我需要在检测到更改后调用函数。您链接的答案正是我想要的: