Javascript 如何迭代提交时传递的淘汰表单元素
我有一个表单,我想用正常的方式提交它,将它绑定到一个函数,而不是像这样访问元素Javascript 如何迭代提交时传递的淘汰表单元素,javascript,forms,dom,knockout.js,Javascript,Forms,Dom,Knockout.js,我有一个表单,我想用正常的方式提交它,将它绑定到一个函数,而不是像这样访问元素 var value = form.element 我想遍历表单元素。表单对象在被访问之前似乎并不包含这些元素,因此如何在不知道元素id的情况下对它们进行迭代呢?我希望避免数字ID和for循环。 以下是我所拥有的不起作用的东西: saveChanges: function(form) { form.each(function( element ) { //do somet
var value = form.element
我想遍历表单元素。表单对象在被访问之前似乎并不包含这些元素,因此如何在不知道元素id的情况下对它们进行迭代呢?我希望避免数字ID和for循环。以下是我所拥有的不起作用的东西:
saveChanges: function(form) {
form.each(function( element ) {
//do something
});
表单对象的console.log()
的输出类似于:
{"0":{},"1":{"__ko__1429589442426":"ko66"},
"2":{"__ko__1429589442426":"ko74"},
"3":{"__ko__1429589442426":"ko79"},
"4":{},"__ko__1429589442426":"ko60"}
有什么建议吗
编辑:为什么我需要这样做
我的表单元素来自我的api,这是一个使用强类型语言创建的应用程序。“首选项”每个都有“booleanvalue”、“numericvalue”、“stringvalue”的值,以及首选类型“bool”、“numb”或“stri”。调用api时,我返回所有值,然后使用knockout的if:binding只显示首选值
api返回的示例:
[{"type":"bool","stringvalue":null,"preference":"taxable","numericvalue":"0","id":3,"booleanvalue":true},{"type":"stri","stringvalue":"Acme inc.","preference":"company_name","numericvalue":"0","id":2,"booleanvalue":false}]
当我在Submit上收集表单输入时,我需要获取首选项的名称和列名、booleanvalue、stringvalue、numericvalue。为此,我将id属性设置为包含信息,以便可以解析id键以获取列名,并使用该值作为列值。以下是一个例子:
id= company_name.stringvalue value= "acme co."
id= taxable.booleanvalue value= "true"
id= tax_rate.numericvalue value= "0.0112"
这是在Durandal应用程序中,因此小提琴不起作用,但您可以看到我的html/js
我没有硬编码这些的原因是因为我将在将来从api中添加更多的首选项,我希望前端能够编辑这些首选项,而不必返回并更改内容。前端应将JSON以以下形式发送到api
{"data":[{"preference":"company_name","stringvalue":"acme inc"},{"preference":"taxable","booleanvalue":"false"}]}
用纯淘汰法解决这个问题很有趣:) 您首先需要的是一个视图模型,它可以处理您奇怪的多类型首选项。让我们称之为
首选项:
// dictionary to convert preference types to
// the properties that hold their values
var typeToValueName = {
bool: 'booleanvalue',
stri: 'stringvalue',
nume: 'numericvalue',
};
// dictionary from types to valid html input types
var typeToInputType = {
bool: 'checkbox',
stri: 'text',
nume: 'number',
};
function Preference(data) {
this.preference = data.preference;
this.valueTypeName = typeToValueName[data.type];
this.inputType = typeToInputType[data.type];
this.value = ko.observable(data[this.valueTypeName]);
// if this is a checkbox, the value is bound differently (you can make this computed if you're dynamically changing your input types)
this.isCheckbox = this.inputType === 'checkbox';
}
然后,您需要将以下内容的数组绑定到表单:
<form data-bind="submit: save">
<!-- ko ifnot: preferences().length -->
Loading preferences...
<!-- /ko -->
<!-- ko foreach: preferences -->
<label>
<span data-bind="text: preference"></span>
<!-- ko if: isCheckbox -->
<input data-bind="attr: {type: inputType}, checked: value"/>
<!-- /ko -->
<!-- ko ifnot: isCheckbox -->
<input data-bind="attr: {type: inputType}, value: value"/>
<!-- /ko -->
</label>
<br/>
<!-- /ko -->
<input type="submit" value="Save"></input>
</form>
var vm = {
preferences: ko.observable([]), // no need to make this an observable array unless you're dealing with adding/removing preferences one by one.
save: function () {
console.log(this.preferences().map(function(p){
var outputFormat = { preference: p.preference };
outputFormat[p.valueTypeName] = p.value();
return outputFormat;
}));
}
};
你可以自动完成上面的很多工作,但这是为了帮助你开始思考“击倒方式”。祝你好运,这里有一把可以玩的小提琴:你可以使用jquery:
$(form).find('input')
这将返回所有表单元素
OTOH,请不要将信息存储在id中。您可以使用数据-
属性,每个属性对应一条信息,然后用以下方式读取它们:
$(form).find('input')[0].attr('data-booleanvalue')
生成的输入应如下所示:
<input type="...." data-booleanvalue="true" ... />
你能做一把小提琴来显示你的html和表单变量吗不要走这条路!至少在使用KnockoutJS时不会。也许你正经历着一个癌症的病例?使用KO,您几乎不需要访问这样的DOM元素,尤其是表单输入值。我建议你看看。