Napisałem kilka niestandardowych powiązań za pomocą KnockoutJS. Nadal nie jestem pewien, kiedy użyć ko.utils.unwrapObservable(item)
Patrząc na kod, to wywołanie zasadniczo sprawdza, czy item
jest obserwowalne. Jeśli tak, zwróć wartość (), jeśli nie, po prostu zwróć wartość. Patrząc na sekcję Knockout dotyczącą tworzenia niestandardowych powiązań, mają one następującą składnię:
var value = valueAccessor(), allBindings = allBindingsAccessor();
var valueUnwrapped = ko.utils.unwrapObservable(value);
W tym przypadku wywołują obserwowalne via, ()
ale potem również wywołują ko.utils.unwrapObservable
. Po prostu staram się ustalić, kiedy użyć jednego z drugim, czy też powinienem zawsze postępować zgodnie z powyższym wzorem i używać obu.
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.ko.utils.unwrapObservable
. Patrząc na kod, po prostu sprawdza, czy jest obserwowalny, a jeśli tak jest, Knockout wywołuje()
wartość tego, co jest obserwowalne, w przeciwnym razie zwraca tylko wartość dla nieobserwowalnego. Jeśli interesuje mnie tylko wartość danych przekazanych do powiązania, dlaczego nie mogę po prostu zawsze używać()
?myBinding
i ktoś wiąże tjdata-bind="myBinding: myValue"
. Jak .myValue
może być obserwowalna lub może to być zwykła właściwość w modelu widoku. Jeśli jest to tylko właściwość i nazywam to funkcją, wtedy pojawi się błąd.ko.utils.unwrapObservable
bezpiecznie zwróci Ci wartość niezależnie od tego, czy otrzymałeś obserwowalny, czy nie.ko.unwrap
jest dostępny w wersji 3.0+. Jeśli używasz starszego niż 3.0,ko.utils.unwrapObservable
to nadal tam jest.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:
Oto przykład prostego niestandardowego wiązania, które napisałem:
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.
źródło