我有一个由许多多选字段组成的表单。每个select都有一个唯一的ID,并相应地命名:
values[foobar1][]
values[foobar2][]
values[foobar3][]
... etc.这个表单可能包含数百个这样的字段,因此由ajax分页。这样做的结果是,不能保证所有记录在前端一次都可用。因此,我不可能提交整个表格。但是,我确实可以在服务器端访问整个记录列表。
我的解决方案是观察表单字段中的更改,对于每个更改的字段,将值存储在一个数组中,以便只跟踪更改的字段值。因此,如果仅更改foobar2,则发送到服务器的结果序列化数组将如下所示:
0: Object {
name: "values[foobar2][]"
value: "thevalue1"
},
1: Object {
name: "values[foobar2][]"
value: "thevalue3"
}因此,这可以很好地工作,除非,正如您可能已经猜到的,当select multiple为空时。无论我使用哪种格式存储更改后的值,无论是每个字段的arraySerialization还是一个关联数组,当我将数组传递给ajax请求的$.param()时,得到的序列化字符串都不包含空值的踪迹。因此,服务器无法确定该值是否已被清空。
有没有人能建议一种方法,一种是将数据传递给服务器,使empt(ied)数组保持完好,另一种方法是处理最初的问题。
提前感谢!
发布于 2016-12-31 01:20:57
为所有选择的字段值创建一个对象,您可以使用localStorage或sessionStorage来存储它。因为表单位于许多页面中,并且您使用ajax来获取每个选择字段。将每个字段的选定值放入数组中。创建一个像这样的对象就是我们的想法。
{
formValues: {
foobar1: {
values: ["thevalue1","thevalue2"]
},
foobar2: {
values: ["thevalue3"]
},
...
foobarN: {
values: []
}
}
}每次更新一个或多个select vield值时,请确保更新localStorage保存值。例如:
var valuesObject = {
formValues: {
foobar1: {
values: ["thevalue1","thevalue2"]
},
foobar2: {
values: ["thevalue3"]
},
foobar3: {
values: []
}
}
}
// Put the object into storage
localStorage.setItem('valuesObject', JSON.stringify(valuesObject));
// Retrieve the object from storage
var valuesObjectA = localStorage.getItem('valuesObject');
//console.log('valuesObject: ', JSON.parse(valuesObjectA));
// post your data
$.post( "ajax.php", valuesObjectA ).done(function( data ) {
alert( "Data Loaded: " + data );
}).fail(function() {
console.log( "error" );
});示例fiddle
发布于 2016-12-31 06:27:00
您希望计算当前状态和以前状态之间的差异,将更改发送到服务器,并将其应用于数据。
您可以使用JSON patch标准(rfc6902)来完成此操作。
JSON是一种用于描述
文档更改的格式。它可以用来避免在只有一部分发生更改时发送整个文档。当与HTTP PATCH方法结合使用时,它允许以符合标准的方式对HTTP进行部分更新。
要创建diff,您可以使用NPM模块,例如jiff。diff是一组修补命令,可以转换JSON文档。例如:
[
{ "op": "replace", "path": "/values/foobar2/", "value": ["thevalue1"] },
{ "op": "remove", "path": "/values/foobar2/"}
]您将diff发送到服务器,然后使用服务器模块(如php-jsonpatch )将补丁应用于服务器上的当前数据。
https://stackoverflow.com/questions/41399919
复制相似问题