我正在创建一个名为“myhandler”的自定义绑定(bind)。 我在初始化阶段不需要任何东西,我不想第一次执行更新功能。 ko.bindingHandlers 的更新成员,如前所述 in the guide ,在绑定(bind)应用程序中执行一次,然后每当可观察到的关联更改时 - 我想跳过绑定(bind)应用程序执行,因为它没有意义,因为页面的其他部分还没有准备好。
在 observable 关联的 newID 中,传入 html 绑定(bind)如下,我在 View 模型中创建了一个标志成员,名称为 bInitExecution (newID.bInitExecution)。
<div><input id="objID" name="objID" data-bind="value: newID, myhandler: newID" /></div>
如果处理程序应该在第一阶段执行操作,则该成员不是可观察的(但我也尝试过不做任何更改),它是一个 bool 值,在模型中它被固定为 true 或 false根据需要,是否也必须在第一次执行更新。
newID = ko.observable();
//.... some other data
newID.bInitExecution = false
我希望如果 bInitExecution 为假,以下代码将跳过第一次执行,然后始终执行,而如果 bInitExecution 为真,则始终执行。
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 的 observables 总是由 myhandler 更新,而 bInitExecution 设置为 false 的,即使 valueAccessor().bInitExecution 在绑定(bind)期间发生变化,之前应用为 console.log在真正的分配显示之后,不执行任何东西,再也不会执行 myhandler.update - 正如 console.log 放在更新函数的头部显示的那样。
我不明白为什么,有人有什么想法吗?谢谢
最佳答案
在 ko bindingHandler 实现中,ko 包装了整个 update
在 ko.dependentObservable
中发挥作用(又名 ko.computed
)。这就是 ko 运行你的 update
的方式和原因。数据模型改变时的功能。
这意味着如果你没有使用 newID()
的值(如 ko.unwrap(valueAccessor())
或 valueAccessor()()
)在您的 update
中函数,最终 ko.dependentObservable
包装器 不依赖于 newID
强>。因此 ko 不会在 newID
时再次运行它。变化。
我猜你没有使用 newID
的值在你的//Do stuff...
.
更新
我错过了这部分。
连newID()
在 //Do stuff
中访问, ko.computed
wrapper 将永远没有机会再次运行。因为在它的第一次运行中,并没有访问newID,实际上没有ko.observable
。在第一次运行时被访问,因此 ko 的自动跟踪系统没有跟踪依赖关系。
关于javascript - 跳过第一个关于 knockout 自定义绑定(bind)的更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25163283/