前面的答案是正确的,但我经常将函数传递给自定义绑定(检查权限或根据其他内容确定要执行的操作的函数等)。我真正需要的是解开任何函数的包装,即使它不是一个可观察的。
以下以递归方式解开所有内容:
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
}
}
}
这样,绑定值始终包含一个值。我不需要担心我是否在可观察量中传递了函数,可观察量,值甚至函数。这将正确打开所有内容,直到它到达我想要的对象。
希望能帮助别人。