总是很高兴看到“新手”决定切换到 KnockoutJS。任何可以帮助摆脱冗长的临时数据绑定解决方案的世界都是一件很棒的事情。
要回答有关如何关闭多个事件以更新数据绑定值的问题,您可以编写:
<input data-bind="value:someObservable, valueUpdate: ['blur', 'afterKeyDown', 'onLoad']"/>
在我的情况下,我使用引导程序预先输入来选择一个值,但是在用户从下拉建议框中进行选择后,数据绑定没有被刷新。查看源代码后,我发现了 KO 文档中没有提到的这个隐藏的小宝石。
我害怕告诉任何人“去阅读源代码”,但是如果您正在处理文档中未涵盖的边缘案例,请不要害怕!通过这样做,我发现了许多未记录的功能
来源:https ://github.com/knockout/knockout/blob/master/src/binding/defaultBindings/value.js
ko.bindingHandlers['value'] = {
'init': function (element, valueAccessor, allBindingsAccessor) {
// Always catch "change" event; possibly other events too if asked
var eventsToCatch = ["change"];
var requestedEventsToCatch = allBindingsAccessor()["valueUpdate"];
var propertyChangedFired = false;
if (requestedEventsToCatch) {
// Allow both individual event names, and arrays of event names
if (typeof requestedEventsToCatch == "string")
requestedEventsToCatch = [requestedEventsToCatch];
ko.utils.arrayPushAll(eventsToCatch, requestedEventsToCatch);
eventsToCatch = ko.utils.arrayGetDistinctValues(eventsToCatch);
}
.... truncated ....
根据您对编写绑定的熟悉程度,很明显 valueUpdate 绑定处理一组事件。在这里,他们获取补充绑定“valueUpdate”并将其存储在 var requestedEventsToCatch
. 下一条注释标记了处理事件数组以更新值的逻辑——实际上它们甚至会"afterKeyDown"
转换单个事件,例如["afterKeyDown"]
希望这可以帮助!