首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >仅序列化已更改的表单元素时,如何处理空数组

仅序列化已更改的表单元素时,如何处理空数组
EN

Stack Overflow用户
提问于 2016-12-31 01:06:33
回答 2查看 57关注 0票数 1

我有一个由许多多选字段组成的表单。每个select都有一个唯一的ID,并相应地命名:

代码语言:javascript
运行
复制
values[foobar1][]
values[foobar2][]
values[foobar3][]
... etc.

这个表单可能包含数百个这样的字段,因此由ajax分页。这样做的结果是,不能保证所有记录在前端一次都可用。因此,我不可能提交整个表格。但是,我确实可以在服务器端访问整个记录列表。

我的解决方案是观察表单字段中的更改,对于每个更改的字段,将值存储在一个数组中,以便只跟踪更改的字段值。因此,如果仅更改foobar2,则发送到服务器的结果序列化数组将如下所示:

代码语言:javascript
运行
复制
0: Object {
    name: "values[foobar2][]"
    value: "thevalue1"
},
1: Object {
    name: "values[foobar2][]"
    value: "thevalue3"
}

因此,这可以很好地工作,除非,正如您可能已经猜到的,当select multiple为空时。无论我使用哪种格式存储更改后的值,无论是每个字段的arraySerialization还是一个关联数组,当我将数组传递给ajax请求的$.param()时,得到的序列化字符串都不包含空值的踪迹。因此,服务器无法确定该值是否已被清空。

有没有人能建议一种方法,一种是将数据传递给服务器,使empt(ied)数组保持完好,另一种方法是处理最初的问题。

提前感谢!

EN

回答 2

Stack Overflow用户

发布于 2016-12-31 01:20:57

为所有选择的字段值创建一个对象,您可以使用localStoragesessionStorage来存储它。因为表单位于许多页面中,并且您使用ajax来获取每个选择字段。将每个字段的选定值放入数组中。创建一个像这样的对象就是我们的想法。

代码语言:javascript
运行
复制
{ 
formValues: {
          foobar1: {
                   values: ["thevalue1","thevalue2"]
                   },
          foobar2: {
                   values: ["thevalue3"]
                   },
        ...
          foobarN: {
                   values: []
                   }           
             }
}

每次更新一个或多个select vield值时,请确保更新localStorage保存值。例如:

代码语言:javascript
运行
复制
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

票数 0
EN

Stack Overflow用户

发布于 2016-12-31 06:27:00

您希望计算当前状态和以前状态之间的差异,将更改发送到服务器,并将其应用于数据。

您可以使用JSON patch标准(rfc6902)来完成此操作。

JSON是一种用于描述

文档更改的格式。它可以用来避免在只有一部分发生更改时发送整个文档。当与HTTP PATCH方法结合使用时,它允许以符合标准的方式对HTTP进行部分更新。

要创建diff,您可以使用NPM模块,例如jiff。diff是一组修补命令,可以转换JSON文档。例如:

代码语言:javascript
运行
复制
[
  { "op": "replace", "path": "/values/foobar2/", "value": ["thevalue1"] },
  { "op": "remove", "path": "/values/foobar2/"}
]

您将diff发送到服务器,然后使用服务器模块(如php-jsonpatch )将补丁应用于服务器上的当前数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41399919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档