ahhay
ahhay | Hinter den Höfen 20 | 37339 Haynrode/Germany | 036077 935077

Knockout


Was ist Knockout?

Das Frontend Framework knockout.js ermöglicht die Trennung von UI und UI-Logik nach dem beliebten Frontend-Pattern Model-View-Viewmodel-Pattern. Dieser Entwurf wird im Artikel nicht beschrieben sondern nur verwendet.

Wer einen schönen Einstieg in die Thematik knockout.js bekommen möchte, dem kann man das Tutorial von Knockout empfehlen.
Dort findet man auch einen Download für das Framework. Natürlich kann man dieses auch über ein NuGet-Package in das Projekt hineinziehen.


Implementierung - html

Im ersten Schritt wird eine html-Seite mit allen notwenigen Referenzen implementiert.
Das Knockout.js-ViewModel "indexViewModel.js" darf natürlich nicht fehlen.
Das knockout-Binding bezieht sich nur auf dem html-Body "ko.applyBindings(viewModel, document.body);".
<!doctype <html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Startseite</title>    
    
    
  </head>
  <body>
    ...
    
    <script src="Scripts/jquery-2.1.1.js"><script>
    <script src="Scripts/knockout-3.3.0.js"></script>
    
    <script src="indexViewModel.js"></script>
    
    <script>
        $(function () {

            var viewModel = new ViewModel();
            ko.applyBindings(viewModel, document.body);
        });
    </script>
  </body>
</html>
                              


Implementierung - databind

Die Eigenschaften und Werte, welche an der GUI gebunden sind („data-bind“), werden über die Schlüsselwörter observable oder observableArray auf Änderung überwacht. Auch die Funktionsaufrufe können mit data-bind=“click: …“ an das Viewmodel übergeben werden.
...
<input … data-bind="value: produktname"/>
...
<select … data-bind="options: produktarten, value: ausgewaehlteProduktart"…/>
...
<button … data-bind="click: neuesProduktSpeichern">Speichern</button>
...
                            


Grundstruktur - js ViewModel

Die Eigenschaften (properties) und Methoden (functions) werden über die Klassenvariable self aufgerufen.
function ViewModel() {
    "use strict";
    var self = this;
…
}
                            


Implementierung - js ViewModel

In der Beispielanwendung kann man die Implementierungsarten der ViewModel Eigenschaften und Methoden sehen.
function ViewModel() {
    "use strict";
    var self = this;
    self.name = ko.observable("");
    self.arten = ko.observableArray(['A', 'B', 'C']);
    self.ausgewaehlteArt = ko.observable();
    self.preis = ko.observable();

    self.liste = ko.observableArray([]);

    self.speichern = function () {
        var command = {
            Name: self.name(),
            Art: self.ausgewaehlteArt(),
            Preis: self.preis()
        };
    ...
    }
}
                            


databind - Arten - html

Art Beschreibung HTML JS
visible Sichtbarkeit,
Ein-/ Ausblenden des zugehörigen DOM-Elements
<div data-bind="visible: istSichtbar">
    …
</div>
                                            
istSichtbar = ko.observable(true);
                                            
text Text-Bindung,
Anzeige eines Textes im zugehörigen DOM-Elements
<span data-bind="text: meldung"></span>
                                            
meldung: ko.observable(“Hallo Welt!”)
                                            
html html-Bindung,
Anzeige von HTML-Elementen im zugehörigen DOM-Elements
<div data-bind="html: detail"></div>
                                            
detail = ko.observable(“<span>Testbeispiel</span>”);
                                            
css css-Bindung,
einer CSS-Klassen zugeordnete DOM-Element
<div data-bind="css: { profitWarnung: wert() < 0 }">
    Wert-Information
</div>

                                            
wert: ko.observable(150000); // grün
…
wert: ko.observable(-50); // rot

                                            
value Wert an Formular-Elemente wie <input>, <select> und <textarea> binden
<input data-bind="value: nutzer" />
                                            
nutzer = ko.observable("")
                                            
attr attr-Binding,
generische Möglichkeit den Wert eines Attributs für die zugehörigen DOM-Elements zubinden
<a data-bind="attr: { href: url, title: detail }">
    Report
</a>

                                            
url = ko.observable("ahhay.html");
details = ko.observable("Autorenseite")

                                            


Fazit - Knockout

Neben den Globalplayer angularJS von google haben sich eine Reihe von JS Frameworks mit unterschiedlichen Schwerpunkten entwickelt, Knockout ist eines davon. Der Schwerpunkt liegt hier in der Umsetzung des MVVM-Patterns, was sehr gut gelungen ist. Dieser Artikel beschreibt nur einen kleinen Teil des Framework und soll daher nur ein Einstieg sein.
In den nächsten Monaten sollen weitere Funktionen hier vorgestellt und beschrieben werden.