これまでの回答は正しいですが、カスタムバインディング(権限をチェックしたり、何かに基づいて何をすべきかなどを決定する関数)に関数を渡すことがよくあります。私が本当に必要としたのは、たとえそれが観測可能ではないとしても、関数をアンラップすることでした。
//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.utils.unwrapFunction = function (func) {
if (typeof func != 'function') {
return func;
}
else {
return ko.utils.unwrapFunction(func());
}
};
私が書いた結合単純なカスタムの一例である:以下
は
再帰的にすべてがアンラップします。私は、関数、オブザーバブル、値、またはオブザーバブル内の関数さえ渡しても心配する必要はありません。これは、私が望むオブジェクトに到達するまで、すべてを適切にアンラップします。
誰かを助ける希望。
カスタムバインディングのベストプラクティスを進めてきたパターンもありますか? – arb
本当に状況によって異なります。いくつかのカスタムバインディングは、オブザーバブルでのみ動作するように設計されているため、フロント(ko.isObservable)でオブザーバブルであることを確認してから、自由にアンラップすることができます()。 Observableがネストされているオブジェクトを受け取っている場合は、オブジェクトのアンラップしたバージョンを取得しようとしている場合は、 'ko.utils.unwrapObservable'を使用するのではなく、' ko.toJS(yourObject) 'を実行する方が良いでしょうウィジェットやサードパーティライブラリに渡すことができます。一般的に、 'ko.utils.unwrapObservable'を使用して、オブザーバブルとノンオブザーバブルをサポートするのが最も安全です。 –
私は 'ko.utils.unwrapObservable'の目的が混乱していると思います。コードを見ると、それは観測可能かどうかをチェックし、そうであればKnockoutは '()'を呼び出してオブザーバブルの値を取得し、そうでなければ観測できない値を返します。私が興味を持っているのは、バインディングに渡されたデータの価値です。どうして私はいつも '()'を使うことができませんか? – arb