In dieser Übung werden wir die noteArea
und ToDoList
Gadgets programmieren, um Einträge im items
Bereich anzuzeigen. Wir gehen dabei folgendermaßen vor.
Schritt 1: Hinzufügen von Attributen zum noteArea Gadget - Verwenden des attributes
Elements in Verbindung mit dem inherits
Attribut um die Datenelemente eines "to-do" Eintrags zu speichern und zu verwalten.
Schritt 2: Erstellen von JavaScript Funktionen für das noteArea Gadget - Erstellen einer JavaScript Datei mit Funktionen speziell für das noteArea
Gadget. Zusätzlich zur component
Funktion wird diese Datei eine onInitialized
, setDisplay
, und blankDisplay
Funktion enthalten. Die setDisplay
Funktion legt die Attribute des Gadgets fest (wie durch das attributes
Element definiert) und setzt sie den Werten des aktuellen Eintrags gleich, die der Funktion übergeben wurden. Die blankDisplay
Funktion setzt die Attribute des Gadgets auf die statischen Standartwerte.
Schritt 3: Zuweisen der JavaScript Funktionen zum noteArea Gadget - Zuweisen der noteArea JavaScript Datei zum noteArea
Gadget und anschließender Modifikation der Definition des Gadgets um die onInitialized
Funktion aufzurufen, wenn der initialized
Event auftritt.
Schritt 4: Hinzufügen von JavaScript Funktionen zum ToDoList Gadget - Hinzufügen von Funktionen zum ToDoList
Gadget um den Standardeintrag (wenn die Anwendung das erste mal geladen wird) und den aktuellen Eintrag im items
Bereich anzuzeigen (nachdem ein neuer Eintrag erstellt wurde).
Schritt 5: Testen der Anwendung - Ausführen der Anwendung und sicherstellen, dass der Standardeintrag angezeigt wird, wenn die Anwendung das erste mal geladen wird. Dann, nachdem ein Eintrag erstellt wurde, ist sicherzustellen, dass der neue Eintag angezeigt wird.
Schritt 1: Hinzufügen von Attributen zum noteArea Gadget
Zuerst werden wir im noteArea
Gadget das attributes
Element verwenden um ein Set an standard Datenattributen und Werten zu definieren die mit dem Gadget verbunden sind: Titel, Datum, Beschreibung, und Bild. (Diese Attribute repräsentieren Datenelemente eines "to-do" Eintrags im Eintragsbereich.) Danach werden wir das inherits
Attribut verwenden, um die Attribute der relevanten Parts des noteArea
Gadgets zu referenzieren.
Generell, wenn Daten mit einem Gadget verknüpft sind, die von der Anwendung manipuliert werden müssen, sollte das attributes
Element in Verbindung mit dem inherits
Attribut verwendet werden, um die Daten zu verwalten. Diese Methode erlaubt es dem Gadget die Daten zu kontrollieren, ohne auf dessen Parts zuzugreifen und diese zu manipulieren.
Um diesen Schritt abzuschließen, bearbeiten wir die noteAreaGadgets.box
Datei und:
Innerhal des noteArea
Gadget Elements, fügen wir das attributes
Element hinzu um die folgenden Datenattribute für das Gadget zu deklaieren und initialisieren: title, date, description, und image.
In den itemTitle
, itemDate
, und itemDescription
Parts, entfernen wir das value
Attribut. Dann fügen wir das inherits
Attribut hinzu, das den Wert, der im zugehörigen Datenattribut definiert ist, enthält.
Im itemImage
Part, entfernen wir das src
Attribut und fügen danach das inherits
Attribut ein, das den Wert, der im zugehörigen Datenattribut definiert ist, enthält.
Der Code, der unten fett hervorgehoben ist demonstriert, wie das zu tun ist.
<?xml version="1.0" encoding="utf-8" ?> <?import href="box://ocpToolkit/content/inputPack/inputGadgets.box"?> <?import href="box://ocpToolkit/content/core/coreGadgets.box"?> <?import href="box://ocpToolkit/theme/default/toolkit.box"?> <library xmlns="http://www.aol.com/boxely/resource.xsd" xmlns:box="http://www.aol.com/boxely/box.xsd" xmlns:s="http://www.aol.com/boxely/style.xsd"> <gadget id="noteArea"> <attributes title="" date="" description="" image="" /> <parts> <box:label id="itemTitle" inherits="value=title" /> <box:label id="itemDate" inherits="value=date" /> <box:vbox id="descriptionContainer"> <box:multilineLabel id="itemDescription" inherits="value=description" /> </box:vbox> <box:image id="itemImage" inherits="src=image" /> </parts> </gadget> <style tag="noteArea" orient="vertical" margin="12 0" flex="1" fill="url(#notepadImage)" hAlign="center" vAlign="top"> <part name="itemTitle" padding="0" margin="8 0 0 0" fontFamily="Arial" fontSize="22pt"/> <part name="itemDate" padding="0" margin="0" fontFamily="Arial" fontSize="12pt"/> <part name="descriptionContainer" overflow="scroll" minHeight="90" maxHeight="90" minWidth="280" maxWidth="280" hAlign="center" margin="14 0"/> <part name="itemDescription" width="240" minHeight="80" fontFamily="Brush Script" fontSize="14pt"/> <part name="itemImage" maxWidth="240" maxHeight="180"/> </style> </library>
In den Parts des noteArea
Gadgets in denen das "inherits" Attribut verwendet wird, darf nicht vergessen werden, das enthaltene Attribut zu entfernen: value
(für die itemTitle
, itemDate
, und itemDescription
Parts) und src
(für den itemImage
Part).
Schritt 2: Erstellen von JavaScript Funktionen für das noteArea Gadget
Für das noteArea
Gadget müssen wir zunächst JavaScript Funktionen erstellen, die das Gadget repräsentieren und initialisieren. Dann müssen wir Funktionen erstellen, um einen Standardeintrag (wenn die Anwendung das erste mal gestartet wird) und den aktuellen Eintrag im items
Bereich anzuzeigen (nachdem eine neuer Eintrag erstellt wurde).
In einem Texteditor erstellen wir eine neue Datei namens noteAreaGadgets.js
fügen folgenden Code ein. Es ist sicherzustellen, die Datei im gleichen Verzeichnis zu speichern, in dem sich die anderen "To-Do List" Anwendungsdateien befinden.
// Die component Funktion wird aufgerufen, wenn das Gadget // das erste mal instantiiert wird function component (_gadget) { } // Die onInitialized Funktion wird aufgerufen wenn ein Gadget erstellt // wird, aber noch nicht dargestellt wird (d.h. sichtbar ist) component.prototype.onInitialized = function() { } // Die setDisplay Funktion bevölkert die noteArea Gadget Parts mit // den Werten im Element des Eintrags Arrays, der der Funktion // übergeben wird. component.prototype.setDisplay = function(item) { this._gadget.setAttribute("title", item["title"]); this._gadget.setAttribute("date", formatDate(item["date"])); this._gadget.setAttribute("description", item["description"]); this._gadget.setAttribute("image", item["image"]); } // Die blankDisplay Funktion bevölkert die noteArea Gadget Parts mit // Standardwerten. component.prototype.blankDisplay = function() { this._gadget.setAttribute("title", "[no note to display]"); this._gadget.setAttribute("date", ""); this._gadget.setAttribute("description", "Instructions: Add a note with the button 'Create To-Do Item' below."); this._gadget.setAttribute("image", gDefaultImage); }
Un so funktioniert es:
Die component
Funktion repräsentiert das noteArea
Gadget. Das OCP Toolkit erstellt eine Instanz des component Objekts wenn das Gadget das erste mal instantiiert wird.
Die onInitialized
Funktion tut nichts. (Wir kümmern uns jetzt noch nicht darum. In Kapitel neun, werden wir diese Funktion aktualisieren um Datenbindung einzubinden.)
Die setDisplay
Funktion setzt die Datenattribute des Gadgets (wie im attributes
Element des Gadgets definiert) mit den Werten vom item
das der Funktion übergeben wurde gleich.
Die setAttribute
Methode, die in dieser Funktion verwendet wurde übernimmt zwei Parameter: der erste ist der Name des zu setzenden Attributs (der Anme muss zu einem Wert im attributes
Element des Gadgets passen), der zweite ist der Wert auf den das Attribut festgelegt wird.
Die blankDisplay
Funktion legt die Attribute des Gadgets auf die statischen, Standardwerte fest.
Schritt 3: Zuweisen der JavaScript Funktionen zum noteArea Gadget
Um die noteArea JavaScript Funktionen, die wir im vorigen Teil definiert haben, zu verwenden müssen wir die noteAreaGadgets.box
Datei bearbeiten:
Im gadget
Start-Tag, verwenden wir die language
und code
Attribute um die noteAreaGadgets.js
Datei mit dem noteArea
Gadget zu verbinden.
Im gadget
Element, fügen wir ein script
Element hinzu, um die common.js
Datei zu laden. (Die common.js
Datei enthält den Ort des Standardbildes, gDefaultImage
, das in einem "to-do" Eintrag verwendet wird.)
Im gadget
Element, fügen wir ein behavior
Element ein, um die onInitialized
Funktion aufzurufen.
Der Code, unten fett hervorgehoben, demonstriert, wie das zu tun ist.
<gadget id="noteArea" language="jscript" code="noteAreaGadgets.js" > <attributes title="" date="" description="" image="" /> <script id="common" language="jscript" href="../../common/common.js" /> <parts> <box:label id="itemTitle" inherits="value=title" /> <box:label id="itemDate" inherits="value=date" /> <box:vbox id="descriptionContainer"> <box:multilineLabel id="itemDescription" inherits="value=description" /> </box:vbox> <box:image id="itemImage" inherits="src=image" /> </parts> <behavior> <reaction event="initialized" action="gadget:onInitialized();" /> </behavior> </gadget>
Im obigen Code ist sicherzustellen, dass die script und href Werte richtig bearbeitet werden, um auf die richtigen Pfade der noteAreaGadgets.js
und common.js
Dateien zu verweisen.
Schritt 4: Hinzufügen von JavaScript Funktionen zum ToDoList Gadget
Als Nächstes, müssen wir JavaScript Funktionen zum ToDoList Gadget hinzufügen, um den Standardeintrag (wenn die Anwendung das erste mal startet) und den aktuellen Eintrag anzuzeigen (nachdem ein neuer Eintrag erstellt wurde).
Wir öffnen die ToDoList.js
Datei und fügen folgenden Code ein, unten fett hervorgehoben.
// Die component Funktion wird aufgerufen, wenn das Gadget // das erste mal instantiiert wird function component (_gadget) { } // Deklaieren der Eigenschaften für die Verwendung im Gadget component.prototype.titleArea = null; component.prototype.noteArea = null; component.prototype.buttonsArea = null; component.prototype.items = Array(); component.prototype.currentItem = -1; // Die onInitialized Funktion wird aufgerufen wenn ein Gadget erstellt // wird, aber noch nicht dargestellt wird (d.h. sichtbar ist) component.prototype.onInitialized = function () { // auslesen jedes Parts des Gadgets mit deren zugehörigen ID Attributen this.titleArea = this._gadget.getPartById("titleArea"); this.noteArea = this._gadget.getPartById("noteArea"); this.buttonsArea = this._gadget.getPartById("buttonsArea"); // Wir haben nu Zugriff aud die individuellen Gadgets und können ihre // Funktionen verwenden und auf ihre Eigenschaften zugreifen this.displayDefaultItem(); } // Die onCreateItem Funktion wird aufgerufen wenn der 'create to-do item' // Button gedrückt wird component.prototype.onCreateItem = function () { shell.print("ToDoList::onCreateItem"); var paramDictionary = shell.serviceManager.basics.dictionary; paramDictionary.setValueForKey(this._gadget,"parentGadget"); // öffnen eines eigenen Dialogs shell.openSceneAndWait("../../common/CreateNewItemDialog.box", this.scene, "CreateNewItemDialog", paramDictionary); } component.prototype.insertItem = function (item) { this.items.push(item); this.currentItem = this.items.length - 1; this.displayCurrentItem(); } component.prototype.displayDefaultItem = function () { this.noteArea.blankDisplay(); } component.prototype.displayItem = function (index) { if (this.items.length == 0) { this.displayDefaultItem(); return; } if (index > (this.items.length - 1)) { this.currentItem = this.items.length - 1; } else if (index < 0) { this.currentItem = 0; } else { this.currentItem = index; } var item = this.items[this.currentItem]; this.noteArea.setDisplay(item); } component.prototype.displayCurrentItem = function () { this.displayItem(this.currentItem); }
Und so funktioniert der obige Code:
Die displayDefaultItem
Funktion ruft die blankDisplay
Funktion der noteArea auf, die die Attribute des noteArea Gadgets auf statische Stadardwerte festlegt.
Die displayItem
Funktion übernimmt einen Parameter, index
, welcher den Seicherort des Eintrags im items
Array repräsentiert, der angezeigt werden soll. Die Funktion prüft zuerst ob die Länge des items
Arrays null ist, in dessen Fall sie den Standardeintrag anzeit und beendet wird. Falls die Länge des items
Arrays nicht null ist, setzt die Funktion die currentItem
Eigenschaft, basierend auf der folgenden Logik:
Wenn der Index, der der Funktion übergeben wurde größer ist, als die Position des alten Eintrags im Array, wird die currentItem
Eigenschaft mit der Position des letzten Eintrags im Array gleichgesetzt.
Andernfalls, wenn der Index kleiner als null ist, wird die currentItem
Eigenschaft auf null gesetzt.
Andernfalls, wenn der Index nicht größer als der des letzten Eintrags im Array ist and nicht kleiner als null ist, wird die currentItem
Eigenschaft mit dem Index gleichgesetzt.
Sobald die currentItem
Eigenschaft gesetzt ist, wir die setDisplay
Funktion der noteArea aufgerufen, und der Eintrag im item Array, der einen Indexwert, gleich dem der in der currentItem
Eigenschaft gespeichert ist, hat übergeben.
Die displayCurrentItem
Funktion ruft die displayItem
Funktion auf, und übergibt currentItem
als Index der den anzuzeigenden Eintrag repräsentiert.
Schritt 5: Testen der Anwendung
Jetzt, wenn wir das erste mal die "To-Do List" Anwendung öffnen, sollten wir den standard "to-do" Eintrag sehen. Wenn wir einen neuen Eintrag erstellen und einfügen, sollte der Eintrag angezeigt werden, wie in den Bildern unten gezeigt:
Tabelle 4.7. Einen neuen "to-do" Eintrag einfügen
![]() |
![]() |
|
Wir erstellen einen neuen Eintrag und wählen "Insert Item" aus. |
Der Eintrag wird im Anwendungshauptfenster angezeigt. |
Jetzt, da wir neue "to-do" Einträge in der Anwendung erstellen und anzeigen können, wird es Zeit die anderen Buttons im buttonsArea
Gadget anzusehen: "Prev Note", "Next Note", "Clear To-Do Item", und "Clear To-Do List". Wir fahren mit der nächsten Übung fort, um zu lernen, diese Buttons zu programmieren.