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
。谢谢