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();
          }
        );

两个实际问题:

  1. 如果我使用 that.form.value.email 而不是 that.password1.get('value'),有时会将过时的值提交给表单 (!)。例如,如果我在密码 2 字段中输入一些内容并立即按回车,实际提交会发生在 Dojo 中的预期?怎么会这样?

  2. 有没有更好的方法来获取表单的值,以便 'p​​assword[0]' 和 'password[1]' 自动成为一个数组等?

4

2 回答 2

1

dijit.form 下的每个小部件都确保使用其值更新具有正确名称的一个表单元素,即使这些值类似于过滤选择单击或日历中的日期。

话虽如此,我们知道一个常见的 form.submit() 将按预期工作。

然而,在以 AJAX 请求的形式提交时,我们需要循环表单元素的值,并使其成为 json 键值对象。

你很容易, dojo.xhrPost 如果这样调用,则在内部执行此操作:

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

对于更高级别的控制,您可以使用dojo.formToJsondijit.form.Form.getValues- 例如这两个变体

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 - keyup 事件或 2 - onblur 事件,设置值就完成了。为确保发送正确的值,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 回答