Javascript 推迟或暂停在knockout中评估依赖项,直到viewmodel完全更新(例如使用映射插件)

Javascript 推迟或暂停在knockout中评估依赖项,直到viewmodel完全更新(例如使用映射插件),javascript,knockout.js,knockout-mapping-plugin,Javascript,Knockout.js,Knockout Mapping Plugin,我有一个复杂的淘汰视图模型,它是使用映射插件创建的。我还使用映射插件更新了viewmodel: ko.mapping.fromJS(json, viewmodel); 我有几个订阅使用多个viewmodel字段来计算结果。mapping插件分别更新每个字段,knockout在每次更改时执行订阅。因为并非所有值都在同一时间更新,所以计算有时会针对不同字段混合使用新旧值,这在我的例子中会导致问题 有没有办法告诉mapping插件或knockout,在我告诉它所有的值都已设置之前,一般都要等待依赖

我有一个复杂的淘汰视图模型,它是使用映射插件创建的。我还使用映射插件更新了viewmodel:

 ko.mapping.fromJS(json, viewmodel);
我有几个订阅使用多个viewmodel字段来计算结果。mapping插件分别更新每个字段,knockout在每次更改时执行订阅。因为并非所有值都在同一时间更新,所以计算有时会针对不同字段混合使用新旧值,这在我的例子中会导致问题


有没有办法告诉mapping插件或knockout,在我告诉它所有的值都已设置之前,一般都要等待依赖项的评估

我最后做的是在我的viewmodel中创建一个observable,在批量更新完成后,它被赋予一个值。我还定义了一个手动订阅,在此时执行相关代码:

viewmodel.finishedBatchUpdate : ko.observable();

...
ko.mapping.fromJS(json, viewmodel);
viewmodel.finishedBatchUpdate.notifySubscribers(true);

...
viewModel.finishedBatchUpdate.subscribe(function() {
  // my code
});

我还可以创建一个
pureComputed
,并让它依赖于这个可观察对象,但我不需要在这个pureComputed本身上绑定任何东西。在我看来,手动订阅更干净。

我最终做的是在我的viewmodel中创建一个可观察的对象,在批量更新完成后,该对象被赋予一个值。我还定义了一个手动订阅,在此时执行相关代码:

viewmodel.finishedBatchUpdate : ko.observable();

...
ko.mapping.fromJS(json, viewmodel);
viewmodel.finishedBatchUpdate.notifySubscribers(true);

...
viewModel.finishedBatchUpdate.subscribe(function() {
  // my code
});

我还可以创建一个
pureComputed
,并让它依赖于这个可观察对象,但我不需要在这个pureComputed本身上绑定任何东西。在我看来,手动订阅更干净。

如果可以用计算的可观测值替换所有订阅,则可能不会出现此问题。计算属性可以完成此任务,如果您只需要最终值,还可以在模型中设置一些标志,以定义对象是否已初始化,此外,您还可以在加载所有内容后简单地注册订阅。任何其他解决方案都会导致不确定的结果,因为您已经准备好了。如果您可以用计算的可观测值替换所有订阅,则可能不会出现此问题。如果您只需要最终值,则计算属性可以完成此工作,您还可以在模型中设置一些标志来定义对象是否已初始化,也可以在加载所有内容后简单地注册订阅。任何其他的解决方案都会导致不确定的结果,因为你已经得到了