Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何迭代提交时传递的淘汰表单元素_Javascript_Forms_Dom_Knockout.js - Fatal编程技术网

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元素,尤其是表单输入值。我建议你看看。