如何等到所有 ViewModel 公式在 ExtJS 中完成更改?

How to wait until all ViewModel formulas are done changing in ExtJS?

我正在使用 Ext JS 框架。我们有一个相当复杂的 ViewModel,其中有许多公式绑定到其他公式。我希望仅在 ViewModel 完成其长级联事件触发事件后才能 运行 一些代码。我正在尝试验证,在计算完所有 ViewModel 公式后,数据模型是否与我们 API 返回的计算字段的预期值保持一致——基本上是一个延迟的 model.isDirty()检查。

我试过使用 setTimeout 将我的事件添加到事件队列的末尾,但它有时会在公式更新级联的中间触发。我可以简单地设置一个更长的超时时间,但这感觉很麻烦,会迫使用户等待更长时间,并且不能保证在特别慢的浏览器上工作。

有什么好的方法可以在 ViewModel 计算完成后立即 运行 编码,而不是更早一点?

有没有办法检查 ViewModel 是否完成?

是否有一种类似于 setTimeout 的方法来延迟事件,但只有在事件队列完全变空后才延迟到 运行?

我已经解决了我自己的问题。

在 Ext JS 版本 7.3.1 中,您可以检查 ViewModel 的调度程序的 scheduledCount 成员,以找出是否有任何 ViewModel 公式正在等待 运行。如果该值为零,则可以确定 ViewModel 已完成计算。

const scheduler = this.getViewModel().getScheduler();

setTimeout(awaitViewModelFinished, 0);
function awaitViewModelFinished() {
    if (scheduler.scheduledCount > 0) {
        setTimeout(awaitViewModelFinished, 0);
        return;
    }

    // Payload code goes here.
}

我找不到框架支持的功能来执行此操作。根据 sencha docs,“[Scheduler] 是框架内部使用的私有实用程序 class。不要依赖它的存在。”如果您使用的是另一个 Ext JS 版本,您可能需要为此找到类似但不同的解决方案。

在控制器内部你可以使用:

// come viewModel options might not be resolved

this.getViewModel().notify();

// all viewModel options are solved

!!注意:如果绑定为 null,则绑定公式不会 运行。