jquery - Removing items from Spring's AutoPopulatingList -
i have created dynamic form using spring autopopulatinglist , jquery. addition works charm, new items created , persisted database. issue deletion: update method gets full list, regardless of deletion of elements on browser side.
controller's update method simple 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()); }
user pojo implementation follows
@entity public class user implements serializable { ... @onetomany(targetentity = language.class, fetch = fetchtype.eager, cascade = cascadetype.all) private list<language> languages = new autopopulatinglist(language.class); ... }
the post request goes controller looks (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
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
so communication side looks ok, user retrieved @modelattribute("user") in updateuser method still has 3 language elements, valid (that not null). suggestions? i'm using spring 3.1.1 , jquery 1.7.2 if that's relevant.
edit: client side code adding/removal of fields 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")); }
and removal:
$.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(); }); };
try using lazylist instead of autopopulatinglist. using add dynamic content html , data in model attribute object. below code using create list.
private list<operationparameters> operationparameterses = lazylist.decorate(new arraylist<operationparameters>(), factoryutils.instantiatefactory(operationparameters.class)); @onetomany(cascade=cascadetype.all, fetch=fetchtype.lazy, mappedby="operations") public list<operationparameters> getoperationparameterses() { return this.operationparameterses; } public void setoperationparameterses(list<operationparameters> operationparameterses) { this.operationparameterses = operationparameterses; }
and in controller when list populated in model attribute first check empty data in list , removes them following code , persist in database. otherwise tries insert null data in database.
operations.getoperationparameterses().removeall(collections.singleton(null));
hope helps you. cheers.
Comments
Post a Comment