1

私はこのようなフォームを持っています(ウィジェットテンプレートから):

   '<div>' +
    '  <form data-dojo-type="dijit.form.Form" data-dojo-attach-point="form" method="POST"> ' +
    '    <label for="${id}_workspace">Workspace name</label>  ' +
    '    <input name="workspace" id="${id}_workspace" data-dojo-attach-point="workspace" data-dojo-type="app.ValidationWorkspace" />' +
    '    <label for="${id}_password1">Password</label>  ' +
    '    <input name="password[0]" id="${id}_password1" data-dojo-attach-point="password1" data-dojo-type="app.ValidationPassword" />' +
    '    <label for="${id}_password1">Confirm password</label>  ' +
    '    <input name="password[1]" id="${id}_password2" data-dojo-attach-point="password2" data-dojo-type="app.ValidationPassword" />' +
    '    <input type="submit" data-dojo-attach-point="button" data-dojo-type="app.BusyButton" label="Create!" />' +
    '  </form>' +
    '</div>',

コードで、私は書いた:

        data = {};
        data.workspace = that.workspace.get('value');
        data.password = [];
        data.password[0] = that.password1.get('value');
        data.password[1] = that.password2.get('value');

        // Store the data 
        g.stores.workspacesAnon.put(data).then(
          function(res){
            console.log("Jsonrest put(data) returned OK: " + json.toJson(res) );
            that.button.cancel();
          }
        );

2つの実際の質問:

  1. that.password1.get('value')の代わりにthat.form.value.emailを使用すると、古い値がフォーム(!)に送信されることがあります。たとえば、password2フィールドに何かを入力し、すぐにEnterキーを押すと、実際の送信はDojoで期待どおりに行われますか?どうしてそれが起こるのですか?

  2. 「password[0]」と「password[1]」が自動的に配列になるように、フォームの値を取得するためのより良い方法はありますか?

4

2 に答える 2

1

dijit.formの下のすべてのウィジェットは、値がフィルタリング選択クリックやカレンダーの日付のようなものであっても、正しい名前の1つのフォーム要素がその値で更新されることを確認します。

そうは言っても、一般的なform.submit()が期待どおりに機能することはわかっています。

ただし、AJAXリクエストとして送信を行う場合は、フォーム要素の値をループして、jsonキー値オブジェクトにする必要があります。

あなたはそれを簡単にしています、dojo.xhrPostはこのように呼び出された場合、これを内部的に行います:

dojo.xhrPost ( {
   url: 'submiturl.sapi',
   form: dojo.byId('myFormDomId')
} )

より高いレベルの制御には、次のいずれかを使用できます。dojo.formToJsonたとえばdijit.form.Form.getValues、これら2つのバリアント

var values = dojo.formToJson(dojo.byId('myFormDomId'));
// OR
var values = dijit.byId('myFormDijitId').getValues();
// mod or mixin your custom values, examplewise
values = dojo.mixin(values, {   anotherVariable: 'sentAsPostParam'   });

dojo.xhrPost ( {
    url: 'submitUrl.sapi',
    content : values
} );

最初の質問に関して1)
バリデーターがウィジェットの電子メールに添付されていて、検証が無効になっている場合、入力要素はそれに応じて設定されません。値の設定は、1-キーアップイベントまたは2-オンブラーイベントのいずれかが発生すると行われます。正しい値が送信されるようにするには、次のように使用dijit.form.Form.validateします(フォームdojoTypeが既に拡張されていることを確認してください)。

var formWidget = dijit.byId('myFormDijitId');
if(formWidget.validate()) {  // loops all form widgets and 'sums' up their validators
   dojo.xhrPost( { url: 'submiturl.sapi', content: formWidget.getValues() } );
}

編集:

特にアイテム内にネストされた配列を作成するために、OPはJsonRestストアを必要とします-正確に同じ名前で入力要素を呼び出す必要があります。

<input name="password" 
                        id="${id}_password1" data-dojo-attach-point="password1" data-dojo-type="app.ValidationPassword" />
<input name="password" 
                        id="${id}_password2" data-dojo-attach-point="password2" data-dojo-type="app.ValidationPassword" />

また、ネイティブフォーム要素でdojo.formToJsonを使用します(設定されている値をアサートするために検証後に実行します)。

    g.stores.workspacesAnon.put(
       dojo.formToJson(widgetReference.form.domNode)
    ).then( ... );
于 2012-08-05T21:24:28.250 に答える
0

dojo.xhrPost()フォームの指定を使用できます。このリンクを参照して、dojo.byId( "myform")を送信する例1を見てください。このように呼び出すことができ、それらのパラメーターをサーバーに渡す方法について心配する必要はないと思います。これで、古いパラメータを送信する問題が修正されるはずです。

これについて何かコメントが必要な場合。

ラック、

于 2012-08-05T20:40:23.267 に答える