我正在创建一个名为“myhandler”的自定义绑定。 在初始化阶段我什么都不需要,我不希望第一次执行更新功能。 ko.bindingHandlers的更新成员,如所述in the guide,在绑定应用程序时执行一次,然后每当可观察到相关更改时 - 我想跳过绑定应用程序执行,因为它没有意义,因为页面的其他部分不是准备好了。
在observable关联的newID中,传递了html绑定,如下所示,我在视图模型中创建了一个标志成员,名称为bInitExecution(newID.bInitExecution)。
<div><input id="objID" name="objID" data-bind="value: newID, myhandler: newID" /></div>
成员,如果处理程序应该在第一阶段执行操作,那么它不是可观察的(但我也试过这样做而没有任何改变),它是一个布尔值,在模型中它被修复为true或false如果需要,还必须在第一时间进行更新。
newID = ko.observable();
//.... some other data
newID.bInitExecution = false
如果bInitExecution为false,我希望以下代码跳过第一次执行,然后执行always,而如果bInitExecution为true则始终执行。
ko.bindingHandlers.myhandler = {
init: function init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
//None needed here
},
update: function(element, valueAccessor, allBindings) {
if (valueAccessor().bInitExecution===true) {
//Do stuff
}
if (valueAccessor().bInitExecution===false) valueAccessor().bInitExecution=true;
}
};
结果是,在第一次执行之后,bInitExecution设置为true的observable总是由myhandler更新,而bInitExecution设置为false的observable设置为false,即使valueAccessor()。bInitExecution在绑定期间更改也应用为console.log之前并且在真正的赋值显示之后,不执行任何东西,再也不执行myhandler.update - 因为放在更新函数头部的console.log显示。
我不明白为什么,有人有任何想法?感谢
答案 0 :(得分:2)
在ko bindingHandler实现中,ko将整个update
函数包装在ko.dependentObservable
(又名ko.computed
)中。这就是ko在数据模型更改时运行update
函数的方式和原因。
这意味着如果您未在newID()
函数中使用ko.unwrap(valueAccessor())
(valueAccessor()()
或update
)的值,则最终{{1} } wrapper 不依赖于ko.dependentObservable
。因此,当newID
更改时,ko不会再次运行它。
我猜您没有在newID
中使用newID
的值。
<强>更新强>
我错过了这一部分。
即使在//Do stuff...
中访问newID()
,//Do stuff
包装也永远无法再次运行。因为在第一次运行时,不访问newID,实际上在第一次运行中没有访问ko.computed
,因此ko的自动跟踪系统没有跟踪任何依赖性。