以前の答えは正しいですが、多くの場合、関数をカスタムバインディングに渡します(アクセス許可をチェックしたり、何かに基づいて何をするかを決定する関数など)。私が本当に必要だったのは、たとえそれが観察可能でなくても、関数をアンラップすることでした。
以下は、すべてを再帰的にアンラップします。
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)
は、を使用するよりもを使用した方がよいko.utils.unwrapObservable
でしょう。一般に、ko.utils.unwrapObservable
オブザーバブルと非オブザーバブルをサポートするために使用するのが最も安全 です。