0

DojoMVCのSimpleLoginの実装に関して/-私が理解していない点が1つあります。phusickからのサンプルに関して、ログインダイアログクラスはdom.byId( "dialog-template")の呼び出しを行います-"dialog-template"は、ダイアログのテンプレートであるスクリプトからのIDであり、 htmlテンプレート-メインのhtmlにはありません。したがって、それを削除すると、dom.byIdの呼び出しは失敗します

だから私のコード構造は次のとおりです

main.html(main.jsのみが呼び出されます-それ以上は呼び出されません)main.js(以下が含まれます)

    require([
"dojo/_base/declare","dojo/_base/lang","dojo/on","dojo/dom","dojo/Evented",
"dojo/_base/Deferred","dojo/json","dijit/_Widget","dijit/_TemplatedMixin",
"dijit/_WidgetsInTemplateMixin","dijit/Dialog",
"widgets/LoginDialog",
"widgets/LoginController",
"dijit/form/Form","dijit/form/ValidationTextBox","dijit/form/Button",

"dojo/domReady!"
], function(
declare,lang,on,dom,Evented,Deferred,JSON,  
_Widget,
_TemplatedMixin,
_WidgetsInTemplateMixin,
    
 Dialog,
 LoginDialog,
 LoginController
) {
// provide username & password in constructor
// since we do not have web service here to authenticate against    
var loginController = new LoginController({username: "user", password: "user"});

var loginDialog = new LoginDialog({ controller: loginController});
loginDialog.startup();
loginDialog.show();

loginDialog.on("cancel", function() {
    console.log("Login cancelled.");        
});

loginDialog.on("error", function() {
    console.log("Login error.");
});

loginDialog.on("success", function() {
    console.log("Login success.");
    console.log(JSON.stringify(this.form.get("value")));
});

  
});

これで、LoginDialog.jsとLoginDialogTemplate.htmlがダイアログのテンプレート化されたウィジェットになり、LoginController.jsがコントローラーになります。

私のLoginDialog.jsは

define([
"dojo/_base/declare","dojo/_base/lang","dojo/on","dojo/dom","dojo/Evented","dojo/_base/Deferred","dojo/json",

"dijit/_Widget","dijit/_TemplatedMixin","dijit/_WidgetsInTemplateMixin",
"dijit/Dialog","dijit/form/Form","dijit/form/ValidationTextBox","dijit/form/Button",
"dojo/text!templates/loginDialogTemplate.html",
"dojo/text!templates/loginFormTemplate.html",

"dojo/domReady!"
], function(
declare,lang,on,dom,Evented,Deferred,JSON,
_Widget,
_TemplatedMixin,
_WidgetsInTemplateMixin,
Dialog,
Form,
Button,
template

) {

return declare([ Dialog, Evented], {
    
    READY: 0,
    BUSY: 1,
    
    title: "Login Dialog",
    message: "",
    busyLabel: "Working...",
    
    // Binding property values to DOM nodes in templates
    // see: http://www.enterprisedojo.com/2010/10/02/lessons-in-widgetry-binding-property-values-to-dom-nodes-in-templates/
    attributeMap: lang.delegate(dijit._Widget.prototype.attributeMap, {
        message: {
            node: "messageNode",
            type: "innerHTML"               
        }            
    }),
    
    constructor: function(/*Object*/ kwArgs) {
        lang.mixin(this, kwArgs);            
        var dialogTemplate = dom.byId("dialog-template").textContent;
        var formTemplate = dom.byId("login-form-template").textContent;
        var template = lang.replace(dialogTemplate, {
            form: formTemplate                
        });

        var contentWidget = new (declare(
            [_Widget, _TemplatedMixin, _WidgetsInTemplateMixin],
            {
                templateString: template                   
            }
        ));
        contentWidget.startup();
        var content = this.content = contentWidget;
        this.form = content.form;
        // shortcuts
        this.submitButton = content.submitButton;
        this.cancelButton = content.cancelButton;
        this.messageNode = content.messageNode;
    },
    
    postCreate: function() {
        this.inherited(arguments);
        
        this.readyState= this.READY;
        this.okLabel = this.submitButton.get("label");
        
        this.connect(this.submitButton, "onClick", "onSubmit");
        this.connect(this.cancelButton, "onClick", "onCancel");
        
        this.watch("readyState", lang.hitch(this, "_onReadyStateChange"));
        
        this.form.watch("state", lang.hitch(this, "_onValidStateChange"));
        this._onValidStateChange();
    },
    
    onSubmit: function() {
        this.set("readyState", this.BUSY);
        this.set("message", "");
        var data = this.form.get("value");
        
        var auth = this.controller.login(data);
        
        Deferred.when(auth, lang.hitch(this, function(loginSuccess) {
            if (loginSuccess === true) {
                this.onLoginSuccess();
                return;                    
            }
            this.onLoginError();
        }));
    },
        
    onLoginSuccess: function() {
        this.set("readyState", this.READY);
        this.set("message", "Login sucessful.");             
        this.emit("success");
    },
    
    onLoginError: function() {
        this.set("readyState", this.READY);
        this.set("message", "Please try again.");
        this.emit("error");         
    },
    
    onCancel: function() {
       this.emit("cancel");     
    },

    _onValidStateChange: function() {
        this.submitButton.set("disabled", !!this.form.get("state").length);
    },

    _onReadyStateChange: function() {
        var isBusy = this.get("readyState") == this.BUSY;
        this.submitButton.set("label", isBusy ? this.busyLabel : this.okLabel);
        this.submitButton.set("disabled", isBusy);
    }            
});
});

私のloginDialogTemplate.htmlは次のとおりです

<script type="text/template" id="dialog-template">
<div style="width:300px;">
  
    <div class="dijitDialogPaneContentArea">
        <div data-dojo-attach-point="contentNode">
            {form}              
        </div>
    </div>

    <div class="dijitDialogPaneActionBar">
        <div
            class="message"
            data-dojo-attach-point="messageNode"                
        ></div>      
        <button
            data-dojo-type="dijit.form.Button"
            data-dojo-props=""                
            data-dojo-attach-point="submitButton"
        >
            OK
        </button>
        
        <button
            data-dojo-type="dijit.form.Button"
            data-dojo-attach-point="cancelButton"
        >
            Cancel
        </button>
    </div>      
</div>
</script>

テンプレートにはid="dialog-template"があるため、ウィジェットがdom.byId( "dialog-template")を呼び出すと、エラー "TypeError:dom.byId(...)isnull"がスローされます。行:-> var dialogTemplate = dom.byId( "dialog-template")。textContent;

それで、私はここで何を間違っているのですか?

メインのHTMLですべてのテンプレートスクリプトを使用すると、正常に機能します。

4

1 に答える 1

0

かのように、

定義関数でテンプレートを渡すので、コンテンツを取得するためにdom.byId()は必要ありません。これを試して:

HTMLテンプレートから要素を削除します。

LoginDialog.jsで、関数の引数を次のように変更します。

...
Button,
dialogTemplate,
formTemplate

次の変更にはformTemplateが必要です。「テンプレート」の代わりに「dialogTemplate」を使用したので、例のコードがどのように置き換えられているかがより明確になります。次に、コンストラクターの先頭を次のように変更します。

constructor: function(/*Object*/ kwArgs) {
    lang.mixin(this, kwArgs);
    //var dialogTemplate = dom.byId("dialog-template").textContent;
    //var formTemplate = dom.byId("login-form-template").textContent;
    var template = lang.replace(dialogTemplate, {
        form: formTemplate
    });

    var contentWidget = new (declare(
       ...

コメントしたコードだけを残したので、変更内容を確認できます。これは、dialogTemplate HTMLの{form}プレースホルダーを渡したformTemplateに置き換えて、「template」という新しいテンプレート文字列を作成します。次に、その新しいテンプレート文字列を使用してウィジェットを作成します。

于 2013-03-18T15:58:22.640 に答える