较早的答案是正确的,但通常我将函数传递给自定义绑定(该函数可检查权限或根据其他操作确定要执行的操作,等等)。我真正需要的是解开任何功能,即使这不是可观察的。
以下递归解包一切:
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总是包含一个值。我不必担心是否在可观察对象内部传递了一个函数,一个可观察对象,一个值甚至一个函数。这将正确展开所有内容,直到到达我想要的对象为止。
希望能对某人有所帮助。
ko.toJS(yourObject)
使用a 而不是使用ko.utils.unwrapObservable
,如果您尝试获取该对象的未包装版本以传递到小部件或第3方库中。通常,使用最安全的方法ko.utils.unwrapObservable
来支持可观察和不可观察的对象。