Einfaches Login-Implementierung für Dojo MVC
Gibt es irgendein Beispiel, wie implementieren Sie eine einfache login-Seite/dialog? Ich habe versucht, es zu tun mit dojo boilerplate (überprüfen Sie meine früheren Fragen : Layout-Umsetzung für Dojo MVC). So weit, ich konnte meine Dialogfeld. Aber ich möchte in der Lage sein, um meine Daten und Ereignis klicken wollen, um eine alert-box zum Beispiel (mit seinem Inhalt).
Meiner Sicht:
<form action="Login" method="post" validate="true" id="loginForm">
<table width="258">
<tr>
<td><label>Login</label></td>
<td><input class="cell" type="text" trim="true" dojoType="dijit.form.TextBox" value="" name="login" id="userId"/></td>
</tr>
<tr>
<td><label>Password</label></td>
<td><input class="cell" type="password" trim="true" dojoType="dijit.form.TextBox" value="" name="password" id="password"/></td>
</tr>
<tr><td colspan="2"> </td></tr>
<tr>
<td colspan="2" align="center">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" valign="top"><button dojoType="dijit.form.Button" type="submit" id="LoginButton" onClick="connect">Ok</button></td>
<td align="left" valign="top"><button dojoType="dijit.form.Button" type="submit" onclick="document.Login.reset()" id="Cancel">Cancel</button></td>
<td><button dojoType="dijit.form.Button" type="submit" onclick="showDialog();" id="resetPassword"> Show Dialog </button></td>
</tr>
</table>
</td>
</tr>
</table>
</form>
Mein Widget Modul/Klasse
define([
"dojo/_base/declare",
"dijit/_Widget",
"dijit/_TemplatedMixin",
"dijit/_WidgetsInTemplateMixin",
"dojo/text!app/views/Login/Login.html",
"dijit/Dialog",
"dijit/form/Button",
"dijit/form/TextBox"
], function(
declare,
_Widget,
_TemplatedMixin,
_WidgetsInTemplateMixin,
template,
Dialog
){
return declare([_Widget, _TemplatedMixin, _WidgetsInTemplateMixin, Dialog], {
templateString: template
});
});
Nun, wenn Sie die HTML-element-id LoginButton anrufen sollte in diesem Fall eine "Verbindung" - Funktion. Die zeigen sollte (für eine alert-box), den Benutzernamen und das Kennwort der aktuellen Eingabe.
Wo lege ich meine Funktion? Art...
connect : function(){
alert("username :" + dom.byId("userId").value()
+ " Password: " + dom.byId("password").value());
}
EDIT: Neuer code
define([
"dojo/_base/declare",
"dijit/_Widget",
"dojo/dom",
"dijit/_TemplatedMixin",
"dijit/_WidgetsInTemplateMixin",
"dojo/text!app/views/Login/Login.html",
"dijit/Dialog",
"dijit/form/Button",
"dijit/form/TextBox"
], function(
declare,
dom,
_Widget,
_TemplatedMixin,
_WidgetsInTemplateMixin,
template,
Dialog
){
return declare("login", [_Widget, _TemplatedMixin, _WidgetsInTemplateMixin, Dialog], {
templateString: template,
postCreate: function() {
this.inherited(arguments);
//make reference to widget from the node attachment
this.submitButton = dijit.getEnclosingWidget(this.submitButtonNode);
//override its onSubmit
this.submitButton.onClick = function(){
alert("username :" + dom.byId("userId").value()
+ " Password: " + dom.byId("password").value());
};
},
//and a sample on how to implement widget-in-template stateful get/setter pattern
//e.g. if submitbutton label should change on some event, call as such:
//dijit.byId('loginForm').set("submitLabel", "Sendin login, please wait");
_setSubmitLabelAttr : function(value) {
return this.submitButton.set("label", value);
},
_getSubmitLabelAttr : function() {
return this.submitButton.get("label");
},
});
});
Meine main.js:
define([ 'dojo/has', 'require', 'dojo/_base/sniff'], function (has, require) {
var app = {};
if (has('host-browser')) {
require([ './views/Login', 'dojo/domReady!' ], function (Login) {
app.login = new Login().placeAt(document.body);
app.login.startup();
//And now…
app.login.show();
});
}
else {
console.log('Hello from the server!');
}
});
InformationsquelleAutor fneron | 2012-06-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinzufügen möchte ich, dass meine Lösung: http://jsfiddle.net/phusick/tG8Sg/
Ist es etwas verdreht, aufgrund der Einschränkungen von jsFiddle, aber die Grundprinzipien sind die gleichen wie beschäftige ich in meiner Codierung.
Zunächst den login-Prozess (oder jede andere form der Verarbeitung) ist gekapselt in den dialog und die Kommunikation mit dem rest der Anwendung dachte emitting evens über
dojo/Evented
. Dies ist, wie es funktioniert:Wie Sie sehen können, in der jsFiddle, es gibt zwei Vorlagen dialog-Vorlage und login-Formular-Vorlage, die ich montieren innerhalb der
LoginDialog
Konstruktor. Der Grund ist, ich hätte normalerweise auch eine Klasse Verpackungdijit/form/Form
zu tun, einige Zauber über den standard hinausdijit/form/Form
- Validierung und Daten-Serialisierung, aber da login ist einfach und es würde ein Chaos in der einzelnen Datei von jsFiddle, ich bin ihn Los. Der Vorteil der Trennung ein Formular aus, wird ein dialog Sie können die gleiche form (D. H. Ansicht), zusammen mit der form von ad-hoc-code woanders, z.B. in einerContentPane
. Die form ist es nur zum anzeigen und sammeln von Daten zu/von der Benutzer, sollte es nicht direkt kommunizieren mit Modell, d.h. web-service, es gibt ein Controller für diesen Zweck:Erstellen Sie eine Instanz der
LoginController
:und übergeben es an
LoginDialog
Konstruktor noch oben gesehen:Schließlich
LoginDialog
Klasse:Finden Sie Vorlagen, die in der oben genannten jsFiddle. Sie sollten in separaten Dateien
required
überdojo/text!
normal. Ich habe Sie in<script type="text/template">
passen in jsFiddle.Danke. Der code ist aus meiner Dojo 1.7-basierte Projekte ich möchte das veröffentlichen auf GitHub. Es ist CMS + CMS-Admin, d.h. im Grunde eine CRUD-Anwendung erstellen, die auf
dojo/store/JsonRest
unddgrid
. Es enthält auch eine RESTful-Backend-geschrieben in Zend Framework, so dass ich denke, es könnte hilfreich sein, da es nicht zu einfach noch zu kompliziert Beispiel, das fehlt in der Dojo-ökosystem. Ich werde Sie wissen lassen, wenn veröffentlicht, wenn Sie interessiert sind.Sie sah in meine anderen Beiträge... ich bin greifen so ziemlich alle Informationen über das dojo. Also ja, ich bin ziemlich interessiert. Ich habe eine ganz konkrete Frage an Sie. Wie wollen Sie die Infrastruktur Ihrer website mit dem dojo? Wie trennen Sie Ihre Dateien? wie für Ihre login-Beispiel. Ich glaube, ich würde erstellen Sie eine Datei : dialog-template.html, login-form-template.html (unter so etwas wie app/views/templates), dann gleiche Angebot mit dem login js-Logik (app/views/LoginDialog.js) und eine für den controller (app/controllers/LoginController.js).. und meine index.html nennt die zwei? Sinn?
Ja, ich mache es genau so, aber ich mag die Benennung von Vorlagen in der gleichen Weise wie js Klassen, so dass eine Vorlage für
LoginDialog.js
wäretemplates/LoginDialog.html
. Jeder namespace hat Vorlagen - Verzeichnis, wenn nötig, wie in diesem dl.dropbox.com/u/2131149/dojo-directory-structure.pngLetzte Frage. Ich sehe, Sie sind mit dojo boilerplate. Wie funktioniert "Instanz" funktioniert? Zum Beispiel, wenn wir weiterhin mit Ihren login-Beispiel, wie erstelle ich es machen (es zeigen) in main.js ...
InformationsquelleAutor phusick
Seing, wie Sie eine Vorlage für das widget, das Sie möchten, um zu machen, verwenden Sie das Vorlagen-widget analysiert werden können. Entnommen aus http://dojotoolkit.org/documentation/tutorials/1.6/templated/ unten beschreibt, wie fügen Sie einen Ereignis zu einem einfachen domnode.
Seing wie Sie widgets in der Vorlage, die Verweise auf Ihre Kind-widgets, und legen Sie deren Eigenschaften über diese Referenzen.
Erstellen Sie einen Ordner, so wird es 'Geschwister' dijit/dojox/dojo Ordner, nennen es 'app'. Und folgende widget-Deklaration, in der eine Datei namens app/widget/MyWidget.js unter;
Und sobald die Dateien vorhanden sind, schreiben Sie Ihre html-etwa so:
Wird dies tun, folgende:
app.widget.MyWidget
<form dojoType="mywidget">
ich hoffe, Ihr mixin#0 war nicht '...' die richtige? 🙂 ich habe ausgefüllt, die Lücken in Antwort
diese dijit.getEnclosingWidget(dies.submitButtonNode) return mich null? Ich weiß nicht, ob Sie schon einen Blick auf dojo boilerplate, aber im Grunde gibt' s eine Datei main.js wo rufe ich meine dialog. überprüfen Sie meine zu Bearbeiten.
ah ok, ich vermute, dass die
<button dojoType...>
Knoten zerstört und ersetzt mit einem anderen domnode (eine aus dem dijit.- Taste.templateString). Grundsätzlich ist das Ziel der Berufung getEnclosingWidget wurde auf Wunsch das widget dijit.Schaltfläche von der domNode Referenz - was hat sich verändert während der Analyse. So wird nicht funktionieren, meine schlecht.. Versuchen in postCreate tundijit.getEnclosingWidget(dojo.query(".dijitButton")[0], this.domNode)
oderthis.getChildren()[ButtonIndex]
haha! Es ist alles gut. Leider, diese 2 Zeilen funktioniert nicht, ich bekomme immer noch diese.submitBtton ist nicht definiert. Warum kann ich einfach nicht erstellen Sie eine Funktion und rufen Sie es als ein Ereignis?
InformationsquelleAutor mschr
Mit Hilfe der mschr. Ich kam accross dieser Lösung.
dojo.connect
sonst wird Ihr dialog wird nicht Müll gesammelt, bis Sie manuell trennen Sie diese Prozedur. Auch_login()
Methode wird nicht aufgerufen im Rahmen Ihres dialogs, so z.B.this.loginButton
wird nicht verfügbar sein, innerhalb_login()
Sie haben, um zu schreibendojo.connect(this.loginButton, "onClick", lang.hitch(this, "_login"))
um dies zu erreichen. Verwendenthis.connect(this.loginButton, "onClick", "_login")
stattdessen_login()
aufgerufen wird, werden im Dialogfeld Rahmen und die Verbindung wird automatisch unterbrochen, in der Zeit der dialog zerstört wird.Bitte beachten Sie auch, dass die Verwendung
dom.byId()
Ursachen Sie verwenden den dialog als ein singleton, das wäre ok, mit einem login-dialog, aber Sie werden nicht in der Lage zu kontrollierenid
s von DOM-Knoten und dijits über die gesamte Anwendung. Sie sollten nichtid
s im dijit-Vorlagen verwendendata-dojo-attach-point
statt.InformationsquelleAutor fneron