2012-02-23 13 views
10

Zauważyłem, że w KnockoutJS które cenią wiązania nie działa, jeśli jest zanegowany:dlaczego negując wartości wiążą się knockoutjs muszą być odwinął

tak:

data-bind="showTip: enableTip, css: { disabled: !addButtonEnabled }" 

robi” t poprawnie odbiera zanegowaną zmienną addButtonEnabled.

Jednak to działa:

data-bind="showTip: enableTip, css: { disabled: !addButtonEnabled() }" 

Dlaczego jest tak, że to musi być odwinął, gdzie inne nie?

Używam nokautu 1.2.1.

Odpowiedz

15

Pozwolę sobie nieco wyjaśnić, jak wygląda powiązanie KO w twoim przykładzie.

W rzeczywistości wiązanie danych zawiera JSON. KO owija go symbolami {} i ocenia jako normalny kod JS. W przykładzie KO dostał tego obiektu po dokonaniu oceny:

{ 
    showTip: enableTip, 
    css: { disabled: !addButtonEnabled } 
} 

css bindingHandler otrzymuje wiążące powinny być stosowane do funkcji bindingAccessor węzła.

Po dokonaniu oceny tej funkcji otrzymujemy "argument" dla wiązania css. która jest równa obiekt

{ disabled: !addButtonEnabled } 

Następnie css bindingHandler iteracji właściwości tego obiektu, do wyznaczenia odpowiednich stylów. Jeśli chodzi o właściwość disabled, musimy odczytać dla niej wartość.

Zazwyczaj wszystkie standardowe powiązania odczytują wartość w następujący sposób: ko.utils.unwrapObservable(value), która zwraca value, jeśli value nie jest obserwowalna lub wartość jest przechowywana w tej obserwowalnej zmiennej.

W twoim przypadku value = !addButtonEnabled. Jak widać !addButtonEnabled jest wyrażeniem JavaScript, a nie obserwowalne. Po prostu ocenia to wyrażenie. Tak więc twój przycisk jest zawsze włączony od observable() != false.

W drugiej analizowanej wartości wartość zawiera obserwowalną wartość, więc działa poprawnie.

Myślę, że jesteś

+0

Bardzo przydatne. Dziękuję Ci! – GRGodoi

+0

Wiem, że to jest stare, ale szukałem tego, ponieważ 'disabled: observable1 || Observable2' nie potrzebuje żadnego z tych nierozpakowanych obserwacji, ale przypuszczam, że powinny one z tego samego powodu, który podałeś w odpowiedzi - wiązanie jest wyrażeniem javascript, a nie tylko obserwowalne. – xdumaine

Powiązane problemy