从Spring的AutoPopulatingList中删除项目 [英] Removing items from Spring's AutoPopulatingList

查看:214
本文介绍了从Spring的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆