In diesem Teil programmieren wir die dynamische Funktionalität von unserem Kanban Board mit Dart.
Elemente vom HTML-Dokument ansprechen
Im ersten Teil haben wir bereits ein kurzes Beispiel gesehen, wie wir mit Dart das Untertitel-Element aus dem HTML-Dokument holen konnten:
querySelector('#subtitle');
Schaue kurz in der index.html
-Datei nach. Dort haben wir bereits alle wichtigen Elemente mit einer ID versehen. Über diese IDs können wir nun sehr einfach die Elemente aus dem Dart-Code heraus ansprechen und schliesslich auch verändern.
Wir ergänzen nun unser main.dart
wie folgt:
import 'dart:html'; InputElement todoInput; ButtonElement todoButton; DivElement todoList; DivElement doingList; DivElement doneList; void main() { // Den Untertitel setzen. var subtitle = querySelector('#subtitle'); subtitle.text = 'by Marco'; // Die Referenzen auf die HTML-Elemente holen. todoInput = querySelector('#todo-input'); todoButton = querySelector('#todo-button'); todoList = querySelector('#todo-list'); doingList = querySelector('#doing-list'); doneList = querySelector('#done-list'); }
Erklärungen
Weil wir die verschiedenen Elemente (Textfeld, Knopf und Listen) immer wieder brauchen werden, speichern wir diese in eigene Variablen. Wir definieren die Variablen ausserhalb der main()
-Funktion, damit wir später auch aus anderen Funktionen darauf zugreifen können.
Wichtig sind auch die Typen der Variablen wie zum Beispiel InputElement
und ButtonElement
.
Schauen wir uns mal das Beispiel vom Button an: Oberhalb der main()
-Funktion wird die Variable todoButton
mit dem Typ ButtonElement
definiert. Innerhalb der main()
-Funktion wird dann das entsprechende Element aus dem HTML-Dokument geholt und in die Variable gespeichert.
Ein Element hinzufügen
Die HTML-Elemente, die wir per Knopfdruck in die Todo-Liste hinzufügen möchten, sehen wie folgt aus:
<a href="#" class="list-group-item list-group-item-action">Neues Todo</a>
Wir erstellen eine neue Funktion, die solche Elemente erstellt und diese an die richtige Liste anhängt. Füge folgende Funktion ganz am Ende der Dart-Datei hinzu:
/// Fügt ein neues Todo-Element zur Liste hinzu. void addTodoItem(Event e) { var newTodo = AnchorElement(); newTodo.href = '#'; newTodo.text = todoInput.value; newTodo.classes.add('list-group-item'); newTodo.classes.add('list-group-item-action'); todoList.children.add(newTodo); // Das Textfeld löschen. todoInput.value = ''; }
Erklärungen
Mit void addTodoItem(Event e)
wird die Funktion definiert. void
bedeutet, dass diese Funktion keinen Wert zurückliefert. Wir wollen einfach eine Aktion ausführen, nämlich, dass ein neues Todo-Element hinzugefügt wird.
In der nächsten Zeile wird ein neues <a>
-Element (AnchorElement
) erstellt.
Jedes <a>
-Element braucht einen Link. Da wir aber nirgendwo hinspringen wollen bei einem Klick, setzen wir den Link auf ein #
.
Mit todoInput.value
holen wir den Wert aus dem Textfeld und setzen ihn gleich in unser neues Todo-Element.
Damit die Elemente schön dargestellt werden, fügen wir die Bootstrap-Klassen list-group-item
und list-group-item-action
hinzu.
Kind-Elemente
Jedes HTML-Element hat eine Liste von allen untergeordneten Elementen (genannt Kind-Elemente). Auch unser todoList
-Element hat eine solche Liste, die wir mit .children
ansprechen können. Wir können also mit todoList.children.add(newTodo)
unser neues Todo-Element an diese Liste anfügen. Dies bewirkt, dass der Browser dieses Element anzeigt.
Auf Events reagieren
Wenn du jetzt das Programm startest, dann funktioniert das Hinzufügen noch nicht. Was fehlt, ist, dass wir auf den Knopfdruck reagieren.
Bei einem Knopfdruck werden vom Browser Events produziert, die wir abfangen können.
Füge die folgende Code-Zeile am Schluss der main()
-Funktion ein:
void main() { ...Bisheriger Code... // Auf Knopfdruck-Event reagieren. todoButton.onClick.listen(addTodoItem); }
Erklärungen
Wir geben an, dass wir beim todoButton
auf den Click-Event reagieren möchten. Die listen
-Funktion akzeptiert einen sogenanntent Event Handler. Ein Event Handler ist eine Funktion, die genau ein Argument, nämlich einen Event
erwartet. Dies entspricht genau unserer addTodoItem
-Funktion. Somit können wir diese Funktion dort angeben.
Sobald nun der Knopf gedrückt wird, so wird unserer addTodoItem()
-Funktion aufgerufen und ein neues Todo-Element wird hinzufgefügt.
Teste das Programm, indem du einen Text in das Feld eingibst und auf den Knopf drückst.
Weitere Informationen
- Auf der Seite von Mozilla findest du die ganze Liste von möglichen HTML-Elementen. Viele dieser HTML-Elemente haben in Dart einen entsprechenden Typ (Klasse), wie zum Beispiel
InputElement
,TextAreaElement
,SpanElement
undListElement
. - Weitere Informationen über die Verwendung von Dart mit HTML findest du in der Tour of Dart (Englisch). Dort wird die ganze Dart-Sprache und wichtige Bibliotheken und Tools erklärt.
Wie weiter?
Im Teil 4 werden wir unser Kanban Board so erweitern, damit die Todos in die zwei anderen spalten verschoben werden können.