【发布时间】:2019-04-08 10:06:54
【问题描述】:
我有一个自定义绑定处理程序,我将它绑定到我的视图模型中的一个复杂对象。
绑定处理程序正常工作,并且当任何可观察的属性更新时调用update 函数。但是,每个更新的属性都会调用update 函数,这会导致奇怪的行为,因为我依赖于整个对象可用且是最新的。
我理解为什么会发生这种情况,因为每个属性都会导致调用更新,并且我想我知道如何防止这种情况发生 - 通过使用 Knockout 的 deferred updates 功能。
但是,我无法找到如何仅为自定义绑定中的 observable 启用延迟更新。我不想在应用程序范围内启用它,因为我正在将绑定编写为库函数。
我尝试了许多不同的方法,包括:
- 试图扩展绑定处理程序本身;
- 扩展
init函数; - 扩展
valueAccessor; -
replacing the
valueAccessorwith a new observable withdeferredapplied; - creating a computed observable and rebinding the element;
所有这些都没有奏效。
我还没有发现任何其他自定义绑定处理程序可以远程接近此类功能,并且一直在尝试将其与其他功能拼凑在一起。
我的绑定代码本身是比较简单的,我把绑定的对象简单的拆分出来参数传给一个Code Mirror实例。
ko.bindingHandlers.editor = {
init: function(element, valueAccessor, allBindingsAccessor) {
var observableValue = ko.utils.unwrap(valueAccessor());
initEditor(element, observableValue, allBindingsAccessor);
},
update: function(element, valueAccessor, allBindingsAccessor) {
var observableValue = ko.unwrap(valueAccessor());
createEditor(codeEditorDiv, observableValue);
resize();
updateEditor(element, observableValue, allBindingsAccessor);
}
};
而我的 HTML 代码是:
<div id="editor" data-bind="editor: EditorVM"></div>
我在 ViewModel 中使用Dotnetify,所以它是一个合理的复杂 C# 类,但只要说绑定正在工作和更新就足够了,但我需要它只在所有属性都更新后调用“更新” .
【问题讨论】:
标签: javascript knockout.js ko-custom-binding