Chciałbym użyć właściwości w moim ViewModel, aby przełączyć, która ikona ma być wyświetlana bez tworzenia oddzielnej obliczonej właściwości odwrotności. czy to możliwe?
<tbody data-bind="foreach: periods">
<tr>
<td>
<i class="icon-search" data-bind="visible: !charted, click: $parent.pie_it"></i>
<i class="icon-remove" data-bind="visible: charted, click: $parent.pie_it"></i>
</td>
</tr>
</tbody>
Mój ViewModel ma właściwości okresów, które są tablicą miesięcy, na przykład:
var month = function() {
this.charted = ko.observable(false);
};
knockout.js
agradl
źródło
źródło
Odpowiedzi:
Używając obserwowalnego w wyrażeniu, musisz uzyskać do niego dostęp jako funkcję, taką jak:
visible: !charted()
źródło
hidden
wiążące w wersji 3.5.0Zgadzam się z komentarzem Johna Papy, że powinno być wbudowane
hidden
wiązanie. Dedykowanehidden
wiązanie ma dwie zalety :hidden: charted
zamiastvisible: !charted()
.charted
bezpośrednio obserwować to, co obserwowalne , zamiast tworzyćcomputed
obserwację!charted()
.hidden
Jednak utworzenie wiązania jest dość proste, na przykład:Możesz go używać tak samo jak wbudowanego
visible
wiązania:źródło
return !ko.utils.unwrapObservable(valueAccessor());
hidden
wiązanie zgodnie z twoim komentarzem. (Swoją drogą, korzystałem z CoffeeScript w moim projekcie w momencie, gdy to pierwotnie publikowałem. Składnia CoffeeScript nie wskazuje na to, kiedy zwrot jest zamierzony.)To trochę zagmatwane, ponieważ musisz to zrobić
więc zrobiłem
mój model to
Sprawdź skrzypce http://jsfiddle.net/khanSharp/bgdbm/
źródło
Możesz użyć mojego powiązania przełącznika / wielkości liter , które obejmuje
case.visible
icasenot.visible
.Możesz też mieć to jako
źródło
Aby powiązanie było świadome zmian we właściwości, skopiowałem widoczną procedurę obsługi powiązania i odwróciłem ją:
źródło
Zastrzeżenie: to rozwiązanie służy wyłącznie do celów rozrywkowych.
źródło
Miałem ten sam problem, jak używać przeciwieństwa do obserwowalnych wartości logicznych. Znalazłem proste rozwiązanie:
Teraz w swoim HTML powinieneś to zrobić
Podczas uruchamiania programu widoczny jest tylko tekst „Text1”, ponieważ „false === false is TRUE”, a Text2 nie jest widoczny.
Powiedzmy, że mamy przycisk, który po kliknięciu wywołuje zdarzenie collectPlacesData. Teraz Text1 nie będzie widoczny, ponieważ „true === false to FALSE”, a tekst 2 będzie widoczny tylko.
Innym możliwym rozwiązaniem może być użycie obserwowalnych obliczeń, ale myślę, że jest to zbyt skomplikowane rozwiązanie tak prostego problemu.
źródło
Można również użyć ukrytego w ten sposób:
źródło