22
Model-View-ViewModel (MVVM) für HTML und JavaScript Norbert Eder http:// devtyr.norberteder.com http://twitter.com/norberteder

Knockout.js

  • Upload
    devtyr

  • View
    1.751

  • Download
    2

Embed Size (px)

DESCRIPTION

Model-View-ViewModel (MVVM) für HTML und JavaScript

Citation preview

Page 1: Knockout.js

Model-View-ViewModel (MVVM) für HTML und JavaScript

Norbert Eder

http://devtyr.norberteder.com

http://twitter.com/norberteder

Page 2: Knockout.js

Was bietet Knockout.js?

Deklarative Bindungen Automatisches Aktualisieren der UI Tracking der Abhängigkeiten Templating

Page 3: Knockout.js

Unterstützte Browser

Internet Explorer 6+ Firefox 2+ Chrome Safari etc.

Page 4: Knockout.js

Model-View-ViewModel

ModelLiegt am Server in der Businesslogik und wird meist per AJAX-Call bezogen.

ViewModelCode-Repräsentation der Daten und Operationen

ViewUser Interface

Page 5: Knockout.js

Vorteile

Kein Code zum Setzen von Werten in der UI bzw. zum Lesen daraus notwendig

Aufgeräumter und einfach zu wartender Code

Sehr einfach zu erlernen Unterstützung der gängigen Browser Einfache Integration in bestehende

Websites

Page 6: Knockout.js

Binding Definition

<div data-bind="visible: isMessageVisible">The message goes here.

</div>

Notwendiges Attribut für die Bindung

Worauf wird gebunden?

Was aus dem ViewModel soll gebunden werden?

Page 7: Knockout.js

Built-in Bindungen für Text Folgende vordefinierten Bindungen für

die Kontrolle von Text und Darstellung stehen zur Verfügung

visible text htmlcss style attr

Page 8: Knockout.js

Built-in Bindungen für Forms

Für die Arbeit mit Formulare stehen folgende Bindungen zur Verfügung:

click event submitenable disable valuehasfocus checked optionsselectedOptionsuniqueName

Page 9: Knockout.js

Beispiel

Daten aus dem ViewModel in einer View anzeigen

Page 10: Knockout.js

Einfaches ViewModel

Definition eines ViewModels mit einigen Eigenschaften

var personViewModel = {    firstName: 'Norbert',    lastName: 'Eder',    blogUrl: 'http://devtyr.norberteder.com',    blogName: 'DevTyr'};

Page 11: Knockout.js

Einfache View

In der View ist nun die Bindung mit dem Attribut data-bind zu setzen

My first name is <span data-bind="text: firstName"></span>.

My last name is <span data-bind="text: lastName"></span>.

Find my weblog @ <a data-bind="attr: { href: blogUrl, title: blogName }">here</a>.

Page 12: Knockout.js

Bindung aktivieren

Damit data-bind ausgewertet wird (da in HTML und dadurch für Browser unbekannt), muss dieses aktiviert werden

ko.applyBindings(personViewModel);

Page 13: Knockout.js

applyBindings Hintergrund Erster Parameter definiert das Objekt,

das gebunden wird. Ein optionaler zweiter Parameter

definiert den Bereich, der nach dem Attribut data-bind durchsucht wird. Wenn nicht gesetzt, bezieht sich die Bindung auf das gesamte Dokument.

Page 14: Knockout.js

Das bisherige Beispiel kann unter

http://jsfiddle.net/GSNAj/

bezogen werden.

Page 15: Knockout.js

Beispiel

Benachrichtigungen über Änderungen; Aktualisierung des UI bei Änderung der Daten im ViewModel

Page 16: Knockout.js

Observables

Werden die Eigenschaften als Oberservables definiert, senden diese Änderungsbenachrichtigungen an die Abonnenten.

Das UI muss nicht verändert werden und bleibt funktionsfähig

firstName: ko.observable('Norbert')

Page 17: Knockout.js

Observables

Bindung einer Schaltfläche an das ViewModel zur Aktualisierung der Daten

Erweiterung ViewModel

<button data-bind="click: changeItem">Change</button>

changeItem: function() {    this.firstName('Norbert Updated');}

Page 18: Knockout.js

Observables

Änderungen am ViewModel werden umgehend im UI wirksam, ohne zusätzlichem Code

Page 19: Knockout.js

Observables lesen/schreiben

personViewModel.firstName() liefert den gesetzten Wert zurück

personViewModel.firstName('Updated') setzt den Wert auf „Updated“.

personViewModel.firstName('Updated').lastName('Updated') aktualisiert firstName UND lastName.

Page 20: Knockout.js

Benachrichtigungen abonnieren

Sollte es notwendig sein, können Änderungsbenachrichtigungen manuell bezogen werden:

personViewModel.firstName.subscribe(function(newValue) { alert("Updated first name: " + newValue);});

Page 21: Knockout.js

Das bisherige Beispiel ist unter

http://jsfiddle.net/eLmaN/

zu finden.