2012-08-05 67 views
1

我有一個這樣的形式(從控件模板)Ajax調用:值窗體的字段使用道場

'<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( '值'),有時過時的值提交表格(!)。例如,如果我在password2字段中鍵入內容並立即輸入,則實際提交是針對Dojo中的預期發生的?它怎麼會發生?

  2. 有沒有更好的方法來獲取表單的值,以便'password [0]'和'password [1]'自動成爲一個數組等等?

回答

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個鍵控事件或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存儲 - 需要通過excact相同的名稱調用輸入元素,例如

<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" /> 

另外,利用道場。formToJson本地表單元素上,像這樣(做驗證之後,觸發設定值):

g.stores.workspacesAnon.put(
     dojo.formToJson(widgetReference.form.domNode) 
    ).then(...); 
+0

感謝您的回答!但是......'formWidget.getValues()'不會創建一個對象,其中'password [0]'和'password [1]'被合併到一個名爲'password'的好數組中,並帶有兩個元素!有沒有簡單的方法來做到這一點? – Merc 2012-08-06 00:52:26

+0

(請記住,我正在保存一個商店:'workspacesAnon.put(data)'所以'data'需要是一個「正常」的數組!) – Merc 2012-08-06 01:05:41

+0

啊我錯過了這個事實,你實際上並沒有自己調用XHR ,是的。在這種情況下,在你的'input name = pass'中輸入NO [0-1-2]並使用dojo.formToJson(參見http://jsfiddle.net/seeds/pnMz6/) – mschr 2012-08-06 10:24:45

0

你可以使用dojo.xhrPost()指定您的形式,看到this link和看一看例1中它發出的dojo.byId(「myForm會」)。我猜你可以這樣調用它,而不用擔心如何將這些參數傳遞給服務器。這應該解決發送過時參數的問題。

如果您對此需要任何評論。

運氣,

相關問題