2012-03-08 16 views
106

Napisałem kilka niestandardowych powiązań za pomocą KnockoutJS. Nadal nie jestem pewien, kiedy użyć ko.util.unwrapObservable(item) Patrząc na kod, to połączenie w zasadzie sprawdza, czy jest możliwe obserwowanie item. Jeśli tak, zwróć wartość(), jeśli nie, po prostu zwróć wartość. Patrząc na odcinku Knockout na temat tworzenia niestandardowych powiązań, mają następującą składnię:Kiedy używać ko.utils.unwrapObservable?

var value = valueAccessor(), allBindings = allBindingsAccessor(); 
var valueUnwrapped = ko.utils.unwrapObservable(value); 

w tym przypadku, oni wzywają obserwowalny poprzez () ale również zadzwonić ko.utils.unwrapObservable. Po prostu próbuję zrozumieć, kiedy użyć jednego z drugim, lub czy powinienem zawsze postępować zgodnie z powyższym schematem i używać obu.

Odpowiedz

135

Powinieneś używać ko.utils.unwrapObservable w przypadkach, gdy nie wiesz, czy dałeś się zaobserwować czy nie. Byłoby to zwykle w niestandardowym powiązaniu, w którym można by było przeciwdziałać obserwowalne lub nieobserwowalne.

W powyższym kodzie wywołanie valueAccessor() nie rozpakowuje obserwowalnego obiektu. Jest to po prostu pobieranie wartości, która została przekazana do powiązania w poprawnym kontekście (zostanie zapakowana w funkcję, aby ją chronić). Wartość zwracana valueAccessor() może być obserwowalna lub nie. To wszystko zostało przekazane do wiązania.

+0

Czy istnieje wzór, w którym opublikowałem sprawdzone metody dotyczące niestandardowych wiązań w przyszłości? – arb

+4

To naprawdę zależy od sytuacji. Niektóre niestandardowe wiązania są zaprojektowane tylko do pracy z obserwowalnymi, więc możesz sprawdzić z góry (ko.isObservable), że jest to obserwowalne, a następnie możesz go rozwinąć za pomocą(). Jeśli otrzymujesz obiekt, który może mieć zagnieżdżone obserwowalne obiekty, lepiej jest zrobić 'ko.toJS (yourObject)' zamiast używać 'ko.utils.unwrapObservable', jeśli próbujesz uzyskać nieopakowaną wersję obiektu przekazać do widgetu lub biblioteki innej firmy. Zasadniczo najbezpieczniej jest używać 'ko.utils.unwrapObservable' do obsługi obserwowalnych i nieobserwowalnych. –

+2

Chyba jestem zdezorientowany tym, co jest celem 'ko.utils.unwrapObservable'. Patrząc na kod, sprawdza on tylko, czy jest on możliwy do zaobserwowania, a jeśli jest, Knockout wywołuje '()', aby uzyskać wartość obserwowalnego, w przeciwnym razie po prostu zwraca wartość nieobserwowalną. Jeśli wszystko, co mnie interesuje, to wartość danych przekazanych do wiązania, dlaczego nie mogę po prostu zawsze użyć '()'? – arb

9

Poprzednia odpowiedź jest poprawna, ale często przekazuję funkcje do niestandardowych powiązań (funkcja, która sprawdza uprawnienia lub określa, co należy zrobić w oparciu o coś innego itp.). Naprawdę potrzebowałem odwinąć każdą funkcję, nawet jeśli nie jest to możliwe do zaobserwowania.

Poniższy rekurencyjnie rozpakowuje wszystko:

ko.utils.unwrapFunction = function (func) { 
    if (typeof func != 'function') { 
     return func; 
    } 
    else { 
     return ko.utils.unwrapFunction(func()); 
    } 
}; 

Oto przykład prostego wiązania zwyczaju pisał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 
     } 
    } 
} 

ten sposób bindingValue zawsze zawiera wartość. Nie muszę się martwić, jeśli przekażę funkcję, obserwowalną, wartość lub nawet funkcję wewnątrz obserwowalnego. Spowoduje to prawidłowe rozwinięcie wszystkiego, dopóki nie dotrze do obiektu, który chcę.

Nadzieję, że pomaga komuś.

+9

Nic nie nadpisuję, unwrapObservable wciąż tam jest, moje nazywa się unwrapFunction. ko.utils jest logicznym obszarem nazw, w którym to się znajduje, ponieważ jest to funkcja nokautu. Zgadzam się, że jest trochę nieporządny, ale zdecydowałem się umieścić to w tej przestrzeni nazw z tego samego powodu, dla którego wtyczka mapowania umieszcza się w przestrzeni nazw ko, chociaż nie ma w niej ko, posiadanie zupełnie nowej przestrzeni nazw właśnie na to nie wydawało się warte zachodu. – pilavdzice

Powiązane problemy