Autor wpisu: batman, dodany: 26.04.2012 08:00, tagi: javascript
Knockout.js jest biblioteką JavaScript z powodzeniem implementującą wzorzec MVVM (Model – View – View Model), znany chociażby z Silverlighta. Wykorzystanie tego wzorca w przypadku standardowego tandemu HTML + JavaScript daje ogromne możliwości w postaci automatycznie aktualizującego się widoku, bez konieczności ręcznego wprowadzania zmian do kodu HTML. Nas jako programistów interesuje tylko jedno – view model, czyli obiektowa reprezentacja danych, która znajduje odzwierciedlenie w warstwie prezentacji. W skrócie, wystarczy zaktualizować obiekt JavaScript, a zmiany zostaną wprowadzone bez naszej ingerencji w widok.
Zacznijmy od prostego przykładu.
<p>jakasZmienna: <span data-bind="text: jakasZmienna"></span></p>
function ViewModel() { this.jakasZmienna = "warosc zmiennej"; } ko.applyBindings(new ViewModel());
Powyższy kod, mimo iż niezbyt skomplikowany, pokazuje siłę Knockout.js. Nasz view model definiuje zmienną o nazwie jakasZmienna. Jak się łatwo domyślić wartość tej zmiennej zostanie wyświetlona wewnątrz znacznika span. Co jednak chcielibyśmy zmodyfikować zawartość tej zmiennej? Sprawdźmy.
Dodajmy do kodu HTML pole tekstowe.
<input type="text" data-bind="value: jakasZmienna" />
I zmodyfikujmy nieco view model.
function ViewModel() { this.jakasZmienna = ko.observable("warosc zmiennej"); }
Teraz zmieniając zawartość pola tekstowego, zaobserwujemy, że wprowadzony tekst pojawia się w akapicie (nie zapomnijcie, że zdarzenie zostanie wywołane w momencie, gdy pole tekstowe przestanie być aktywne).
Oczywiście poza pojedynczymi wartościami, możemy przekazywać całe tablice, dzięki czemu dane przesłane z serwera możemy prezentować w postaci tabel i/lub list. Oto prosty przykład.
Zacznijmy od kodu HTML.
<ul data-bind="foreach: items"> <li data-bind="text: name"></li> </ul>
Jak się zapewne domyślacie, lista zostanie wypełniona danymi z view model.
function ViewModel() { this.items = ko.observableArray( [ { name: "Jan Kowalski" }, { name: "Ewa Wisniewska" }, { name: "Piotr Nowak" } ] ); } ko.applyBindings(new ViewModel());
A co jeśli chcielibyśmy ograniczyć listę elementów i zastosować filtrowanie wyników? Nic prostszego. Wystarczy zastosować instrukcję warunkową if. Możemy użyć jej tak samo jak w przypadku foreach lub zastosować specjalny komentarz.