较早的答案是正确的,但我经常将函数传递给自定义绑定(检查权限的函数,或根据其他内容确定要执行的操作等)。我真正需要的是解开任何函数,即使它不是可观察的。
以下递归展开所有内容:
ko.utils.unwrapFunction = function (func) {
if (typeof func != 'function') {
return func;
}
else {
return ko.utils.unwrapFunction(func());
}
};
这是我编写的一个简单自定义绑定的示例:
//replaces single and double 'smart' quotes users commonly paste in from word into textareas and textboxes with normal text equivalents
//USAGE:
//data-bind="replaceWordChars:true
//also works with valueUpdate:'keyup' if you want"
ko.bindingHandlers.replaceWordChars = {
update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
var bindingValue = ko.utils.unwrapFunction(valueAccessor);
if (bindingValue) {
$(element).val(removeMSWordChars(allBindingsAccessor().value())); //update DOM - not sure why I should need to do this, but just updating viewModel doesn't always update DOM correctly for me
allBindingsAccessor().value($(element).val()); //update viewModel
}
}
}
这种方式 bindingValue 总是包含一个值。我不需要担心我是否传入了一个函数、一个 observable、一个值,甚至一个 observable 中的函数。这将正确展开所有内容,直到它到达我想要的对象。
希望能帮助某人。