< Zurück | Weiter >

Lerneinheit 7: Angepasstes Dojo-Widget erstellen

In dieser Lerneinheit erstellen Sie ein angepasstes Dojo-Widget, das den Benutzern das Bewerten von Filmen und das Hinzufügen von Kommentaren erlaubt.
Dojo-Widgets bestehen aus den folgenden drei Dateien, die der Assistent für neue Dojo-Widgets für Sie erstellt: Sie werden anschließend die HTML-Schablone und die JavaScript-Datei bearbeiten:
  1. Klicken Sie in der Sicht "Enterprise-Explorer" mit der rechten Maustaste auf den Dojo-Ordner und wählen Sie dann Neu > Dojo-Widget aus. Der Assistent für das neue Dojo-Widget wird geöffnet.
  2. Geben Sie im Feld Modulname die Zeichenfolge widgets ein.
  3. Geben Sie im Feld Widget-Name die Zeichenfolge RateAndComment ein. Die HTML-Schablone und das zugehörige Style-Sheet für die Widgetpfade werden automatisch gefüllt. Sie können mithilfe dieses Assistenten weitere Supertypen zu einem angepassten Dojo-Widget hinzufügen, im Rahmen dieses Lernprogramms ist das jedoch nicht erforderlich.
  4. Stellen Sie sicher, dass das Kontrollkästchen zur Verwendung des AMD-Formats aktiviert ist.
  5. Klicken Sie auf Fertigstellen. Die JavaScript-Quellendatei für das Widget wird im Editor geöffnet.
    Für angepasstes Widget generierter Code
    Die Dateien für das angepasste Widget befinden sich im Enterprise-Explorer im Ordner WebContent/dojo/widgets.
    Angepasste Widgetdateien im Enterprise-Explorer
  6. Öffnen Sie in der Sicht "Enterprise-Explorer" die Datei RateAndComment.html im Rich-Page-Editor.
  7. Klicken Sie auf die Registerkarte Quelle, um das HMTL-Markup anzuzeigen.
  8. Erweitern Sie in der Palette das Fach Dojo-Anwendungswidgets.
  9. Verschieben Sie mit Drag-and-drop ein Dialog-Widget innerhalb der <div>-Tags. Bei dem Dojo-Element "dijit.Dialog" handelt es sich um ein Modaldialogfenster, das den Zugriff auf die Anzeige blockiert und diese abblendet.
  10. Fügen Sie einen Dojo-Anschlusspunkt für das Dojo-Dialogwidget hinzu:
    <div data-dojo-type="dijit.Dialog" data-dojo-attach-point="dialogbox"></div>
    Anschlusspunkte ermöglichen es der JavaScript-Datei, auf Variablen zu verweisen, die von der HTML-Datei definiert wurden.
  11. Legen Sie einen Titel für das Dojo-Dialogwidget fest:
    1. Platzieren Sie den Cursor hinter den Attributwert "data-dojo-attach-point" und drücken Sie die Leertaste.
    2. Drücken Sie zum Öffnen von Content-Assist STRG+Leertaste, um nach dem Attribut data-dojo-props zu suchen, und wählen Sie dieses Attribut mit Content-Assist aus:
      "data-dojo-props" in Content-Assist
    3. Platzieren Sie den Cursor in den Attributwert "data-dojo-props".
    4. Öffnen Sie Content-Assist und suchen Sie nach dem Attribut title und wählen Sie dieses Attribut mit Content-Assist aus.
    5. Legen Sie den Titel-Attributwert auf Bewerten und Kommentieren! fest.
    <div data-dojo-type="dijit.Dialog" data-dojo-attach-point="dialogbox" data-dojo-props="title: 'Bewerten und Kommentieren!'"></div>
  12. Innerhalb der <div>-Tags des Dialogs können Sie anhand von Content-Assist Bewertungs- und Kommentarkomponenten hinzufügen:
    1. Geben Sie Bewerten: < ein und drücken Sie STRG+Leertaste, um Content-Assist zu öffnen.
    2. Wählen Sie in Content-Assist div aus:
      "Div" in Content-Assist
    3. Platzieren Sie den Cursor in den eingefügten <div>-Tag und drücken Sie die Leertaste.
    4. Öffnen Sie Content-Assist, um nach dem Attribut data-dojo-type zu suchen, und wählen Sie dieses Attribut mit Content-Assist aus:
      dojotype-Attribut
    5. Platzieren Sie den Cursor zwischen den Anführungszeichen und öffnen Sie Content-Assist. Eine Liste von Dojo-Widgets wird angezeigt.
    6. Suchen Sie nach dem Widget dojox.form.Rating. Während Sie den Namen des Widgets eingeben, wird die Liste, die von Content-Assist angezeigt wird, weiter eingegrenzt.
      dojox.form.Rating in Content-Assist
    7. Bearbeiten Sie den Tag <div> so, dass er wie das folgende Code-Snippet aussieht:
      Rate: <div data-dojo-type="dojox.form.Rating" data-dojo-attach-point="rating" data-dojo-props="numStars:='5'"></div>
      Im Editor wird die Echtzeitüberprüfung unterstützt. Wenn Sie ein ungültiges Element schreiben, wird es überprüft und es werden Warnungen ausgegeben, die beschrieben werden, wenn Sie den Mauszeiger über das ungültige Element bewegen. Im Folgenden ist ein Beispiel für das Schreiben eines nicht definierten Attributs für das Dojo-Widget dojox.form.Rating aufgeführt:
      Überprüfungswarnung für nicht definiertes Attribut
    8. Kopieren und fügen Sie den folgenden Code im Widget "Dialog" in den Editor ein. Platzieren Sie das Element dabei unterhalb des Widgets "Rating":
      <br>
      <br>
      Comments:<div data-dojo-type="dijit.form.Textarea" data-dojo-attach-point = "comments" style="width: 60%;"></div>
      <br>
      <button data-dojo-type="dijit.form.Button" data-dojo-attach-event="onClick: saveFeedback">Submit</button>
      Benutzer können das Widget für den Textbereich (Text area) verwenden, um Kommentare einzugeben. Mit dem Button-Widget können Benutzer Bewertungen und Kommentare übergeben.
  13. Erweitern Sie in der Palette das Fach Dojo-Anwendungswidgets.
  14. Verschieben Sie mit Drag-and-drop ein Widget vom Typ Titelteilfenster außerhalb des Widgets "Dialog" (im Teilfenster "Quelle" nach dem </div>-Tag, der das Widget dijit.Dialog schließt). Ein Teilfenster hat einen Titel, der oben angeordnet ist und ein- oder ausgeblendet werden kann.
  15. Bearbeiten Sie das Titelteilfenster, sodass es wie das folgende Code-Snippet dargestellt wird:
    <div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Protokoll der Bewertungen und Kommentare'">
    <ol data-dojo-attach-point="feedbacklist"></ol>
    </div>
    In der geordneten Liste wird ein Protokoll der Kommentare und Bewertungen gespeichert. Die HTML-Schablone enthält nun die folgenden Elemente:

    Quelle für HTML-Schablone

  16. Nachdem die HTML-Schablone für das angepasste Widget nun erstellt ist, können Sie den JavaScript-Code des angepassten Widgets bearbeiten. Öffnen Sie in der Sicht "Enterprise-Explorer" die Datei RateAndComment.js, die sich unter dem Ordner WebContent/dojo/widgets befindet.
  17. Fügen Sie den Dojo-Widgets, die der HTML-Schablone hinzugefügt wurden, Module-IDs hinzu. Kopieren Sie den folgenden Code und fügen Sie ihn in das Modulabhängigkeitsarray in der Methode "define" des Widgets ein:
    dojox/form/Rating
    dojo/data/ItemFileWriteStore
    dijit/form/Textarea
    dijit/Dialog
    dijit/form/Button
    dijit/TitlePane
    Tipp: Das Modulabhängigkeitsarray befindet sich als Parameter in der Methode "define".
  18. Kopieren Sie den folgenden Code und fügen Sie ihn unterhalb der VariablentemplateString ein:
    movieTitle : "",
    
    	rcStore : new dojo.data.ItemFileWriteStore({
    		data : {
    			items : []
    		}
    	}),
    Der Filmtitel enthält den Namen des Films, der bewertet werden soll. Bei rcStore handelt es sich um einen Dojo-Datenspeicher, der die Daten speichert, die Benutzer bei der Bewertung und der Abgabe von Kommentaren eingeben.
  19. Kopieren Sie die folgenden Funktionen und fügen Sie sie hinter der Funktion "constructor" ein:
    getComment : function(){
    		return this.comments.attr('value');
    	},
    
    	getRating : function(){
    		return this.rating.attr('value');
    	},
    
    	setComment : function(value){
    		this.comments.attr("value", value);
    	}, 
    	
    	setRating : function(value){
    		this.rating.attr("value", value);
    	},
    Die Funktionen fungieren als Getter und Setter für die Werte der Widgets dojox.form.Rating und dijit.form.Textarea. Jede Funktion verwendet den Wert data-dojo-attach-point der einzelnen Widgets, die in der HTML-Schablone definiert wurden, um auf das Attribut "value" zuzugreifen.
  20. Kopieren Sie den folgenden Code und fügen Sie ihn unterhalb der Getter und Setter ein:
    showFeedbackTools : function(movieTitle){
    		this.movieTitle = movieTitle;
    		this.dialogbox.show();
    		},
    Die Funktion showFeedbackTools zeigt das Dialogfenster mit dem Format für die Bewertung und die Abgabe von Kommentaren an. Beim Element movieTitle handelt es sich um den Titel des Films, der momentan bewertet wird.
  21. Nach showFeedbackTools erstellen Sie die Funktion, die zur Speicherung der Kommentare und Bewertung im Datenspeicher für das Widget verwendet wird, sobald auf die Schaltfläche im Dialogfenster geklickt wird. Benennen Sie die Funktion saveFeedback. Dieser Name ist der Funktionsname, den Sie im Attribut data-dojo-attach-event für das onClick-Ereignis der Schaltfläche in der HTML-Schablone für das Widget festlegen.
    saveFeedback : function(){
    				},
    1. Verwenden Sie die zuvor geschriebenen Getter-Funktionen, um die Werte abzurufen, die vom Benutzer im Dialogfenster festgelegt wurden. Innerhalb der Funktion müssen Sie Folgendes eingeben: var userRating = this. Drücken Sie anschließend STRG+Leertaste, um mithilfe von Content-Assist in einer JavaScript-Datei nach der Bewertungseigenschaft zu suchen. Wählen Sie getRating() aus.
    2. Definieren Sie eine Variable für die Kommentare, indem Sie var userComment = this.getComment(); unter der Variablen userRating eingeben.
    3. Speichern Sie die Rückmeldedaten durch den folgenden Code:
      	this.rcStore.newItem({
      		title : this.movieTitle,
      		comment : userComment,
      		rating : userRating
      	});
      Die Daten werden in rcStore als neues Element gespeichert. Dieses neue Element enthält den Filmtitel, der definiert wird, wenn das Dialogfenster geöffnet wird und die Bewertung und die Kommentare vom Benutzer hinzugefügt werden.
    4. Fügen Sie die Werte zu der Liste hinzu, die das Protokoll der Kommentare und Bewertungen enthält. Sie werden als untergeordnete Elemente des HTML-Elements <ol > hinzugefügt, das im Teilfenster für den Titel in der HTML-Schablone des Widgets definiert wurde.
      dojo.create("li", {
      			innerHTML : "<b>Title:</b> " + this.movieTitle + " <b>Rating:</b>"
      					+ userRating + "<br> <b>Comments:</b> " + userComment
      		}, this.feedbacklist);
    5. Kopieren Sie den folgenden Code und fügen Sie ihn nach dem Code aus dem vorherigen Schritt ein, um Werte zurückzusetzen und das Dialogfenster auszublenden.
      this.dialogbox.hide();
      this.setComment("");
      this.setRating(0);
      Durch das Zurücksetzen der Werte werden die Felder bereinigt. Die Werte der Felder aus einer vorherigen Bewertungs- und Kommentaraktion für eine neue Bewertungs- und Kommentaraktion bleiben nicht erhalten. Das Ausblenden des Dialogs ermöglicht es dem Benutzer, mit der Bewertung anderer Filme innerhalb des Datenrasters fortzufahren.
  22. Kopieren Sie die Funktion getCommentsByMovieTitle und fügen Sie sie unterhalb der Funktion saveFeedback ein. Diese Funktion erhält einen Filmtitel als Parameter und gibt einen Array zurück, der alle zu diesem Film abgegebenen Kommentare enthält, die im Datenspeicher gespeichert wurden:
    getCommentsByMovieTitle : function(movieTitle){
    
    		var comments = [];
    		var store = this.rcStore;
    		this.rcStore.fetch({
    			query : {
    				title : movieTitle
    			},
    			onComplete : function(items, request){
    				dojo.forEach(items, function(item){
    					comments.push(store.getValue(item, "comment"));
    				});
    			}
    		});
    
    		return comments;
    	},

RateAndComment.js

RateAndComment.js sieht jetzt wie das folgende Code-Snippet aus:
define("widgets/RateAndComment", [ "dojo", "dijit", "dijit/_Widget",
		"dijit/_TemplatedMixin", "dijit/_WidgetsInTemplateMixin",
		"dojo/text!widgets/templates/RateAndComment.html", "dojox/form/Rating",
		"dojo/data/ItemFileWriteStore", "dijit/form/Textarea", "dijit/Dialog",
		"dijit/form/Button", "dijit/TitlePane"

], function(dojo, dijit, _Widget, _TemplatedMixin, _WidgetsInTemplateMixin) {
	dojo.declare("widgets.RateAndComment", [ dijit._Widget,
			dijit._TemplatedMixin, dijit._WidgetsInTemplateMixin ],
			{
				// Pfad zur Schablone
				templateString : dojo.cache("widgets", "templates/RateAndComment.html"),

				movieTitle : "",

				rcStore : new dojo.data.ItemFileWriteStore({
					data : {
						items : []
					}
				}),

				// Diese Methode überschreiben, um angepasstes Verhalten während dijit-Erstellung
				// zu erhalten.
				// Allgemeine Operationen für Konstruktor:
				// 1) Nicht primitive Typen initialisieren (d. h. Objekte und Arrays)
				// 2) Zusätzliche Eigenschaften hinzufügen, die von aufeinanderfolgenden
				// Lebenszyklusmethoden benötigt werden
				constructor : function() {

				},

				getComment : function(){
					return this.comments.get('value');
				},

				getRating : function(){
					return this.rating.get('value');
				},

				setComment : function(value){
					this.comments.set("value", value);
				},

				setRating : function(value){
					this.rating.set("value", value);
				},

				showFeedbackTools : function(movieTitle){
					this.movieTitle = movieTitle;
					this.dialogbox.show();
				},

				saveFeedback : function(){
					
					var userRating = this.getRating();
					var userComment = this.getComment();
					
					this.rcStore.newItem({
						title : this.movieTitle,
						comment : userComment,
						rating : userRating
					});
					
					dojo.create("li", {
						innerHTML : "<b>Title:</b> " + this.movieTitle + " <b>Rating:</b>"
								+ userRating + "<br> <b>Comments:</b> " + userComment
					}, this.feedbacklist);
					
					this.dialogbox.hide();
					this.setComment("");
					this.setRating(0);
				},
				
				getCommentsByMovieTitle : function(movieTitle){

					var comments = [];
					var store = this.rcStore;
					this.rcStore.fetch({
						query : {
							title : movieTitle
						},
						onComplete : function(items, request){
							dojo.forEach(items, function(item){
								comments.push(store.getValue(item, "comment"));
							});
						}
					});

					return comments;
				},

				// Wenn diese Methode aufgerufen wird, werden alle Variablen
				// "untergemischt".
				// Allgemeine Operationen für postMixInProperties
				// 1) Werte für in der HTML-Dateischablone definierte Widget-Eigenschaftsvariablen
				// bearbeiten und zuordnen
				postMixInProperties : function() {
				},

				// postCreate() wird nach buildRendering() aufgerufen. Dies dient zur
				// Überschreibung, wenn
				// Sie DOM-Knoten aufrufen und/oder bearbeiten müssen, die in Ihrem
				// Widget enthalten sind.
				// Auf DOM-Knoten und -Widgets, bei denen das Attribut dojoAttachPoint
				// angegeben ist, ist jetzt
				// ein direkter Zugriff als Felder auf "this" möglich.
				// Allgemeine Operationen für postCreate
				// 1) In buildRendering() erstellten DOM-Knoten aufrufen und
				// bearbeiten
				// 2) Neue DOM-Knoten oder Widgets hinzufügen
				postCreate : function() {
				}
			});
});

RateAndComment.html

In der Quellensicht sieht RateAndComment.html jetzt wie das folgende Code-Snippet aus:
<div class="RateAndComment">
	<div data-dojo-type="dijit.Dialog" data-dojo-attach-point="dialogbox"
		data-dojo-props="title: 'Bewerten und Kommentieren!'">
		Rate: <div data-dojo-type="dojox.form.Rating" data-dojo-attach-point = "rating" data-dojo-props = "numStars: '5'"></div>
		<br>
		<br>
		Comments: <div data-dojo-type="dijit.form.Textarea" data-dojo-attach-point = "comments" style="width: 60%;"></div>
		<br>
		<button data-dojo-type="dijit.form.Button" data-dojo-attach-event="onClick: saveFeedback">Submit</button>
	</div>
	<div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Protokoll der Bewertungen und Kommentare'">
		<ol data-dojo-attach-point="feedbacklist"></ol>
	</div>
</div>
In der Entwurfsansicht sieht das angepasste Widget jetzt wie folgt aus:
Angepasstes Widget in der Entwurfsansicht

Prüfpunkt für Lerneinheit

Sie haben ein angepasstes Dojo-Widget erstellt.
Sie haben Folgendes erlernt:
  • Vorgehensweise zum Ändern der HTML-Schablone für ein angepasstes Dojo-Widget.
  • Vorgehensweise zum Ändern der JavaScript-Datei für ein angepasstes Dojo-Widget.
< Zurück | Weiter >

Feedback