我使用Spring AutoPopulatingList和JQuery創建了一個動態表單。追加工作就像一個魅力,新的項目被創建並堅持到數據庫。問題在於刪除:無論刪除瀏覽器端的元素,我的更新方法都會獲取完整列表。從Spring的AutoPopulatingList中刪除項目
控制器的更新方法是這麼簡單
@RequestMapping(value = "/user/{id}", method = RequestMethod.POST)
@ResponseBody
public String updateUser(@PathVariable("id") int id, @ModelAttribute("user") User user, HttpServletRequest request) {
userService.update(user);
return messageSource.getMessage("user.data_updated", null, request.getLocale());
}
用戶POJO實現如下
@Entity
public class User implements Serializable {
...
@OneToMany(targetEntity = Language.class, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<Language> languages = new AutoPopulatingList(Language.class);
...
}
都到我的控制器POST請求看起來像(另外,語言2加):
languages[0].code:pl
languages[0].level:Fluent
languages[1].code:de
languages[1].level:Native
languages[2].code:cc
languages[2].level:Intermediate
和刪除(使用JQuery刪除語言1 一個.remove()方法):
languages[0].code:pl
languages[0].level:Fluent
languages[2].code:cc
languages[2].level:Intermediate
所以從通信方面看起來不錯,但是從@ModelAttribute(檢索在UpdateUser兩個方法的用戶「用戶」),仍然有三個語言元素,所有有效(即不爲空)。 有什麼建議嗎? 我使用Spring 3.1.1和JQuery 1.7.2,如果這是相關的。
編輯: 用於添加/移除字段的客戶機側代碼如下:
$.addLanguage = function() {
var newLanguage = $('<input type="text" id="languages' + languagesCounter + '.code" name="languages[' + languagesCounter + '].code" class="langIdentifier"/>' +
'<select id="languages' + languagesCounter + '.level" name="languages[' + languagesCounter + '].level" class="langSelect">' +
'<option value="Basic">Basic</option>' +
'<option value="Intermediate">Intermediate</option>' +
'<option value="Fluent">Fluent</option>' +
'<option value="Native">Native</option>' +
'</select>' +
'<input type="button" id="remove' + languagesCounter + '" onclick="$.removeLanguage(' + languagesCounter + ')"' +
'name="Remove" value="Remove" class="removeButton"/>' +
'<br/>');
languagesCounter++;
newLanguage.insertBefore($("#add"));
}
和用於去除:
$.removeLanguage = function(languageId) {
var languageField = '#languages' + languageId + '\\.code';
var levelField = '#languages' + languageId + '\\.level';
var removeButton = '#remove' + languageId;
$(languageField).fadeOut(250, function() { $(this).remove(); });
$(levelField).fadeOut(250, function() { $(this).remove(); });
$(removeButton).fadeOut(250, function() { $(this).remove(); });
};
它沒有幫助不幸的是......我的意思是,結果是一樣的,我不管刪除表單字段鑑於在控制器我更新的方法我還是有着充沛列表...有以其他方式... –
我不知道你是如何做到這一點在jsp中,但我使用jquery並將它添加到具有由Spring呈現的名稱和ID的jsp中添加html控件。它的工作完美。 –
更新了包含客戶端JavaScript的問題 –