1

我将尽我所能解释我在这里要做的事情。它有点复杂(至少对我来说)

我目前有一个对象,我循环遍历并动态填充带有输入的 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;
                    });
                }
            });
        });
    });
});

我将如何解决这个问题?

4

1 回答 1

0

您还需要 html 中的输入元素来包含它们关联的对象键。

就像是:

<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 修改,我将很乐意从那里帮助调试

于 2012-12-30T01:51:09.287 回答