Javascript 在自定义绑定中扩展可观察对象

Javascript 在自定义绑定中扩展可观察对象,javascript,knockout.js,ko-custom-binding,Javascript,Knockout.js,Ko Custom Binding,我有一个自定义绑定处理程序,我正在绑定到视图模型中的复杂对象 绑定处理程序工作正常,并且在可观察对象的任何属性更新时调用update函数。但是,每个更新的属性都会调用update函数,这会导致奇怪的行为,因为我依赖于整个对象的可用性和最新性 我理解为什么会发生这种情况,因为每个属性都会导致调用更新,我想我知道如何通过使用Knockout的功能来防止这种情况 但是,我找不到如何仅为自定义绑定中的可观察对象启用延迟更新。我不想在应用程序范围内启用它,因为我正在将绑定编写为库函数 我尝试了许多不同的方

我有一个自定义绑定处理程序,我正在绑定到视图模型中的复杂对象

绑定处理程序工作正常,并且在可观察对象的任何属性更新时调用
update
函数。但是,每个更新的属性都会调用
update
函数,这会导致奇怪的行为,因为我依赖于整个对象的可用性和最新性

我理解为什么会发生这种情况,因为每个属性都会导致调用更新,我想我知道如何通过使用Knockout的功能来防止这种情况

但是,我找不到如何仅为自定义绑定中的可观察对象启用延迟更新。我不想在应用程序范围内启用它,因为我正在将绑定编写为库函数

我尝试了许多不同的方法,包括:

  • 尝试扩展绑定处理程序本身
  • 扩展
    init
    函数
  • 扩展
    值访问器
  • )
  • )
所有这些都没有起作用

我还没有发现任何其他自定义绑定处理程序可以远程接近这种函数,并且一直试图将其与其他函数组合在一起

我的绑定代码本身相对简单,我使用绑定对象,简单地拆分参数并将其传递给代码镜像实例

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,因此它是一个相当复杂的C#类,但可以说绑定正在工作和更新,但我只需要在所有属性更新后调用“update”。

不幸的是,您没有显示什么
initEditor
createEditor
updateEditor
使用
observeValue
,因为这可能是您应该扩展observeable的地方

绑定的
init
update
方法创建计算的依赖项,这意味着从
init
开始在调用堆栈中展开的任何可见项都将导致调用
update
方法

在一个抽象的例子中:

const someVM=ko.observable({
a:ko.可观察(1),
b:ko.可观测(2),
c:ko.可观察(3)
});
//一些展开属性的函数
const logABC=函数(vm){
console.log(
vm.a(),
vm.b(),
vm.c()
);
}
//定期绑定更新:
ko.computed(函数更新(){
console.log(
“定期绑定更新:”,
)
logABC(someVM())
});
//更改虚拟机
someVM(someVM());
//更改a、b和c
someVM().a(“a”);
someVM().b(“b”);
someVM().c(“c”)

如何将
updateSub
应用于绑定?我所有的
xEditor
方法都是使用未包装的访问器,并将其中的属性应用于另一个插件,因此发生的情况是
update
对每个更改的属性调用一次,而不是一次用于整个对象。
updateSub
计算作为延迟依赖项添加到
xEditor
方法展开的所有可观察属性。因为我是手动创建的,所以我可以将其扩展为延迟。如果我们依赖于绑定提供的
update
方法,我们将获得每个更改的更新,因为没有办法延迟它。使用外部
valueAccessor
计算中的
update
函数是我丢失的位。这似乎在淘汰赛文档中的任何地方都没有。将其添加到中可以很好地工作,并且只在整个VM更新后调用
update
。谢谢