javascript - javascript中的数据结构,用于存储文档中更改的所有输入字段
问题描述
我有一个使用 Odoo 动态生成的文档。我有 n 个 div,里面可以有不同类型、复选框、文本、数字等的输入框。
现在,当用户更改一个字段时,我对后端进行 rpc 调用并存储更改后的视图的值。
但这是一个问题,因为客户端服务器非常慢......而且每次写入 db 都需要很长时间......这是一个清单,它并不好。
解决方案: 现在我想让用户更改他想要的所有字段,然后使用“更新”按钮为所有更改的视图进行写入。
问题
我不熟悉javascript,也不知道如何实现。现在我想把所有生成的行放在一个标签form
中,当用户点击按钮“更新”时,使用 javascritp 调用form_id.submit()
并找到一种方法来检索输入的所有不同名称并存储值。
有更好的方法吗?比如:如果用户更改一个字段而不是调用来存储新数据,将所有信息放入字典、列表、数组或其他东西中......当用户按下更新时,我会读取这个结构并将所有数据存储在里面.
编辑词典:
dict= {
id_line:{key:values, key:values}
id_line:{key:values, key:values}
...
}
解决方案
您可以执行以下操作,这会将您的值推送到数组中:
var dataToSend = [];
var inputFields = document.querySelectorAll('#myform input');
inputFields.forEach(function(inputField) {
switch(inputField.type) {
case 'text':
case 'number':
dataToSend.push({
inputName: inputField.name, value: inputField.value
});
break
case 'checkbox':
dataToSend.push({
inputName: inputField.name, value: inputField.checked
});
break
default:
break
}
});
您将首先创建一个空数组,然后在表单字段中查询其中的所有输入元素。根据浏览器的不同,这可能会返回一个支持 forEach 方法的可迭代 NodeList,或者它可能返回一个在其原型上没有可用的 forEach 方法的 NodeList。
为简单起见,我们假设浏览器支持它。从这里开始,您需要做的就是确定您当前正在迭代的输入字段的类型,然后使用其名称和值动态创建一个对象,并将其推送到您之前构建的数组中。
迭代完成后的结果应该类似于以下内容:
[
{ inputName: '...', value: '...' },
{ inputName: '...', value: '...' },
{ inputName: '...', value: '...' }
]
如果您担心 NodeList 不支持 forEach 方法,您可以参考这篇文章了解更多信息,并针对该主题进行一些额外的 Google 搜索。
PS 这里的代码是一个示例,因此显然需要确保您的 switch 语句涵盖您正在处理的所有形式的输入
替代解决方案: 发帖人还询问您是否可以不将这些数据存储在数组中,而是作为具有嵌套对象实体的对象。所以这是解决方案
var dataToSend = {};
var inputFields = document.querySelectorAll('#myform input');
inputFields.forEach(function(inputField) {
switch(inputField.type) {
case 'text':
case 'number':
dataToSend[inputField.name] = {
inputName: inputField.name,
value: inputField.value
}
break
case 'checkbox':
dataToSend[inputField.name] = {
inputName: inputField.name,
value: inputField.value
}
break
default:
break
}
});
这应该给你这种类型的结果:
{
someFieldName: {...},
someFieldName2: {...},
someFieldName3: {...}
}
推荐阅读
- php - 不同的正则表达式 preg_match_all 导致现场测试和我的脚本
- java - 为什么 ShowRequestPermissionRationale 不起作用?
- spring - 如何使用spring data jpa实现批量保存
- android - 如何使用 Android Studio 重新安装应用程序
- python - 使用python中的列表矩阵顺时针旋转90度
- html - CSS悬停不渲染
- javascript - JSONata(或 JS)——对 JSON 数组/对象进行分组和求和
- css - CSS 选择器 - 通过前一个元素文本选择元素
- javascript - 如何使用 lodash 用 1 个油门控制多个按钮?
- visual-c++ - 尝试制作一个简单的客户端聊天框;给我一个cout问题