2011-07-16 49 views
1

我有一個這樣的對象:如何映射對象以形成字段?

var settings = { 
    Name: "Fairy Tail", 
    Feature: 
    { 
     Translate: true, 
     Share: true 
    } 
} 

和一個表單

<form> 
    <input type="text" name="Name" /> 
    <input type="checkbox" name="Feature.Translate" /> 
    <input type="checkbox" name="Feature.Share" /> 
</form> 

我怎樣才能使對象填寫「自動」的形式(無手工設置每個字段的值)?

+0

什麼是你的後端,這在c#atleast中稱爲反射,我從來沒有在UI或jQuery級別完成 – kobe

+0

它必須在JavaScript上。我在一個插件上使用它。 – BrunoLM

+0

什麼(如果有的話)框架可用(jQuery,Dojo等)? – jdc0589

回答

3

您可以(爲更復雜的例子jsfiddle)做這種方式,假設你有settings變量設置第一:

var assignValue = function(n, v){ 
    var field = jQuery('form input[name="'+n+'"]'); 
    if (field.attr('type')=='text'){ 
     field.val(v); 
    } else if (field.attr('type')=='checkbox') { 
     field.prop('checked',v); 
    } 
} 

var assignSettings = function(list, prefix){ 
    if (typeof prefix != 'undefined'){ 
     prefix += '.'; 
    }else{ 
     prefix = ''; 
    } 
    for (item in list){ 
     if ((typeof list[item]=='string')||(typeof list[item]=='boolean')){ 
      assignValue(prefix+item,list[item]); 
     }else if(typeof list[item]=='object'){ 
      var n1 = item; 
      assignSettings(list[n1],prefix+n1); 
     } 
    } 
} 

assignSettings(settings); 

而且這種解決方案並不像在版本其他解決方案我已經看到了這樣的限制遠 - 它支持您提供的案例,並且可以輕鬆擴展以支持不同類型的字段和更多級別。

2
var inputs = $('form input[type="checkbox"]'); 

$.each(settings.Feature, function(key, val) { 
    inputs.filter('[name="Feature.' + key + '"]')[0].checked = val; 
}); 

例子:http://jsfiddle.net/9z928/


如果你也想填補了文本字段:

var inputs = $('form input'); 

inputs.first().val(settings.Name); 

$.each(settings.Feature, function(key, val) { 
    inputs.filter('[name="Feature.' + key + '"]')[0].checked = val; 
}); 

例子:http://jsfiddle.net/9z928/1/

+0

如果我有不同的結構,或者像'Feature'這樣的更多對象怎麼辦?我怎樣才能使它與任何物體一起工作? – BrunoLM

+0

@BrunoLM:命名是否一致,這樣像'Feature'這樣的每個鍵都將與同一個鍵開頭的'name'屬性相關聯? 'Feature === Feature.xxxxx' – user113716

+0

命名將始終與對象結構匹配。 '{Something:{Debug:true,Mode:{Max:true}}}'將會有一個名爲'Something.Debug'和'Something.Mode.Max'的字段等等。只有葉節點是字段。 – BrunoLM