从Spring的AutoPopulatingList中删除项目 [英] Removing items from Spring's AutoPopulatingList
问题描述
我已经使用Spring AutoPopulatingList和JQuery创建了一个动态表单.加法就像一个超级按钮,创建新项目并将其持久化到数据库中.问题在于删除:无论浏览器端的元素删除如何,我的更新方法总是获取完整列表.
I have created a dynamic form using Spring AutoPopulatingList and JQuery. Addition works like a charm, new items are created and persisted to the database. The issue is with deletion: my update method always gets the full list, regardless of deletion of the elements on the browser side.
控制器的更新方法很简单
Controller's update method is simple as that
@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):
The POST request which goes to my controller looks like that (addition, language 2 added):
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 .remove()方法删除语言1):
and removal(language 1 removed using JQuery .remove() method):
languages[0].code:pl
languages[0].level:Fluent
languages[2].code:cc
languages[2].level:Intermediate
因此从通信方面看还可以,但是在updateUser方法中从@ModelAttribute("user")检索到的用户仍然具有三个语言元素,所有这些元素都是有效的(不为null). 有什么建议? 如果相关,我正在使用Spring 3.1.1和JQuery 1.7.2.
so from the communication side looks OK, but the user retrieved from @ModelAttribute("user") in updateUser method still has three language elements, all valid (that is not null). Any suggestions? I'm using Spring 3.1.1 and JQuery 1.7.2 if that's relevant.
用于添加/删除字段的客户端代码如下:
The client side code for adding/removal of fields is as follows:
$.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(); });
};
推荐答案
用户"Japs T"提供的解决方案对我也不起作用:
Soluton presented by user "Japs T" doesn't work for me either:
operations.getOperationParameterses().removeAll(Collections.singleton(null));
我对可能的解决方案感到红色.这是列表:
I red about possible solutions. Here is the list:
- 在绑定请求中的值之前删除服务器端的所有项目
- 通过AJAX更新服务器状态
我尝试的不透明"解决方案是隐藏HTML元素,而不是删除和清除输入中的值,然后在服务器端可以实现忽略空"记录的功能.例如:
The "not transparent" solution I would try is hiding HTML element instead of removing and clearing values in inputs, then on server side you can implement functionality of ignoring "empty" records. For example:
interface Removeable {
boolean isEmpty();
}
(Collection<Removeable>)myCollection.removeIf(e -> e.isEmpty())
这篇关于从Spring的AutoPopulatingList中删除项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!