Wcześniejsza odpowiedź jest poprawna, ale często przekazuję funkcje do niestandardowych powiązań (funkcja, która sprawdza uprawnienia lub określa, co zrobić na podstawie czegoś innego itp.). To, czego naprawdę potrzebowałem, to rozpakowanie dowolnej funkcji, nawet jeśli nie jest ona obserwowalna.
Następujący rekurencyjnie rozpakowuje WSZYSTKO:
ko.utils.unwrapFunction = function (func) {
if (typeof func != 'function') {
return func;
}
else {
return ko.utils.unwrapFunction(func());
}
};
Oto przykład prostego niestandardowego wiązania, które napisałem:
//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
}
}
}
W ten sposób bindingValue zawsze zawiera wartość. Nie muszę się martwić, czy przekazałem funkcję, obserwowalną, wartość czy nawet funkcję wewnątrz obserowalnej. Spowoduje to prawidłowe rozpakowanie wszystkiego, aż dotrze do obiektu, który chcę.
Mam nadzieję, że to komuś pomoże.
ko.toJS(yourObject)
a nie używaćko.utils.unwrapObservable
, jeśli próbujesz uzyskać nieopakowaną wersję obiektu, aby przejść do widgetu lub biblioteki innej firmy. Ogólnie rzecz biorąc, najbezpieczniej jest używać goko.utils.unwrapObservable
do obsługi obserwabli i nieobserwowalnych.