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ś
Bardzo przydatne. Dziękuję Ci! – GRGodoi
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