繁体   English   中英

从json动态创建的Javascript表单输入,需要将对象映射到另一个对象的适当字段并保存

[英]Javascript form inputs created dynamically from json and need to map object to proper field from another object and save

我将尽力做到最好,我可以在这里解释我要做什么。 这有点复杂(至少对我来说)

我目前有一个对象,可以循环访问并动态地用输入填充html表单。 这段代码将对象值放置在输入中,并允许我将其编辑/保存回对象。

但是,我实际上需要将对象字段映射到另一个对象中定义的一组字段。 原因是原始对象有时会丢失数据,我想从表单中添加它。

例如:我的对象具有属性“按钮”。 对象的k,v可以说宽度,高度和位置。 但是在我定义“按钮”可用字段的其他对象中,它具有宽度,高度,位置,颜色和过渡效果。 我想做的是,当我单击“按钮”标签时(请参见演示),它向我显示了“控件”对象中的所有字段,并填充了包含该值的其他对象中的所有值。 然后,我可以将值添加到空的输入中,并将其保存回我的对象​​。

这是我的演示(单击标签以查看表单输入): http : //jsfiddle.net/bGxFC/6/

这是我的代码:

    var controls = {
    "Controls": [{
        "Button":[{"Transition": "","BackgroundImage": "","Position": "","Width": "","Height": ""}],

        "Image":[{"BackgroundImage": "","Position": "","Width": "","Height": "", "Type": ""}],

        "Label":[{"Position": "","Width": "","Height": "","Text": "","FontSize":"","Color": "", "FontType": ""}]
    }]
};


var str = 'View\n{\n    Image\n    {\n        BackgroundImage: Image.gif;\n        Position: 0, 0;\n        Width: 320;\n        Height: 480;\n    }\n\n    Button\n    {\n        BackgroundImage: Button.gif;\n        Transition: View2;\n        Position: 49, 80;\n        Width: 216;\n        Height: 71;\n    }\n\n    Button\n    {\n        BackgroundImage: Button2.gif;\n        Position: 65, 217;\n        Width: 188;\n        Height: 134;\n    }\n\n    Label\n    {\n        Position: 106, 91;\n        Width: 96;\n        Height: 34;\n        Text: "Button";\n        FontSize: 32;\n        Color: 0.12549, 0.298039, 0.364706, 1;\n    }\n    \n\n}';

str = str.replace(/(\w+)\s*\{/g, "$1:{"); // add in colon after each named object
str = str.replace(/\}(\s*\w)/g, "},$1"); // add comma before each new named object
str = str.replace(/;/g, ","); // swap out semicolons with commas
str = str.replace(/,(\s+\})/g, "$1"); // get rid of trailing commas
str = str.replace(/([\d\.]+(, [\d\.]+)+)/g, "[$1]"); // create number arrays
str = str.replace(/"/g, ""); // get rid of all double quotes
str = str.replace(/:\s+([^\[\d\{][^,]+)/g, ':"$1"'); // create strings
$("#parseList").html(str);

var objStr;
eval("objStr={" + str + "};");
//End Parse String

$(document).ready(function () {
    var $objectList = $('<div id="main" />').appendTo($('#main'));
    $.each(objStr.View, function(k, v) {
        $('<div/>').append(k).appendTo($objectList).on('click', function(){
            var $wrapper = $('#form .wrapper').empty();
            if(typeof v === 'string') {
                $('<div class="item" />').append('<span class="key">' + k + '</span>' + '<input value="' + v + '"/>').appendTo($wrapper);
            }
            else {//object
                $('<h3 class="formHeading" />').append(k).appendTo($wrapper);
                $.each(v, function(key, val) {
                    $('<div class="item" />').append('<span class="key">' + key + '</span>' + '<input value="' + val + '"/>').appendTo($wrapper);
                });
            }
            $("<button>Save</button>").appendTo($wrapper).on('click', function() {
                if(typeof v === 'string') {
                    v = $(this).closest(".wrapper").find("input").val();
                }
                else {//object
                    $(this).closest(".wrapper").find(".item").each(function(i, div) {
                        var $div = $(div),
                            key = $div.find(".key").text(),
                            val = $div.find("input").val();
                        v[key] = val;
                    });
                }
            });
        });
    });
});

我该如何解决这个问题?

您需要html中的input元素也包含它们关联的对象键。

就像是:

<div class="wrapper">
<h3 class="formHeading" data-item="Button_2">Button_2</h3>

<div class="item"><span class="key">Type</span><input value="Button" data-property="Type"></div>
<div class="item"><span class="key">BackgroundImage</span><input value="Button2.gif"  data-property="BackgroundImage"></div>
<div class="item"><span class="key">Position</span><input value="65,217"></div><button class="save">Save</button>

</div>

JS

$('button.save').click(function(){
    var $form=$(this).closest( '.wrapper'), itemName=$form.find('.formHeading').data('item')
   var objectItem= storedObject[ itemName ];

   $('.item').each(function(){
        var $input=$(this).find(':input');
        objectItem[ $input.data('property')]= $input.val();
   })  

})

如果您可以摆脱所有的字符串解析器,并在演示中使用适当的javascript对象,并添加这些html修改,我将很乐意帮助您从那里进行调试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM