推迟或暂停在 knockout 中评估依赖关系,直到 viewmodel 完全更新(例如使用映射插件)
Defer or pause evaluating dependencies in knockout until viewmodel is completely updated (using for instance the mapping plugin)
我有一个复杂的挖空视图模型,它是使用映射插件创建的。我还使用映射插件更新视图模型:
ko.mapping.fromJS(json, viewmodel);
我有几个订阅使用多个视图模型字段来计算结果。映射插件分别更新每个字段,knockout 在每次更改时执行订阅。因为并非所有值都同时更新,所以计算有时会混合使用不同字段的旧值和新值,这在我的案例中会导致问题。
有没有办法告诉映射插件或一般的 knockout 等待依赖项的评估,直到我告诉它所有值都已设置?
我最后做的是在我的 viewmodel 中创建一个 observable,它在批量更新完成后被赋予一个值。我还定义了当时执行相关代码的手动订阅:
viewmodel.finishedBatchUpdate : ko.observable();
...
ko.mapping.fromJS(json, viewmodel);
viewmodel.finishedBatchUpdate.notifySubscribers(true);
...
viewModel.finishedBatchUpdate.subscribe(function() {
// my code
});
我也可以创建一个 pureComputed
并让它依赖于这个 observable,但我不需要在这个 pureComputed 本身上绑定任何东西。在我看来,手动订阅更干净。
我有一个复杂的挖空视图模型,它是使用映射插件创建的。我还使用映射插件更新视图模型:
ko.mapping.fromJS(json, viewmodel);
我有几个订阅使用多个视图模型字段来计算结果。映射插件分别更新每个字段,knockout 在每次更改时执行订阅。因为并非所有值都同时更新,所以计算有时会混合使用不同字段的旧值和新值,这在我的案例中会导致问题。
有没有办法告诉映射插件或一般的 knockout 等待依赖项的评估,直到我告诉它所有值都已设置?
我最后做的是在我的 viewmodel 中创建一个 observable,它在批量更新完成后被赋予一个值。我还定义了当时执行相关代码的手动订阅:
viewmodel.finishedBatchUpdate : ko.observable();
...
ko.mapping.fromJS(json, viewmodel);
viewmodel.finishedBatchUpdate.notifySubscribers(true);
...
viewModel.finishedBatchUpdate.subscribe(function() {
// my code
});
我也可以创建一个 pureComputed
并让它依赖于这个 observable,但我不需要在这个 pureComputed 本身上绑定任何东西。在我看来,手动订阅更干净。