Javascript 如何使用 Mustache.js 在下拉列表中设置选定的值?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5518915/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-23 17:35:29  来源:igfitidea点击:

How to set a selected value in a dropdown list using Mustache.js?

javascriptjquerytemplatesmustache

提问by nolabel

Is it possible to do this with Mustache.js?

可以用 Mustache.js 做到这一点吗?

var data = {"val":"3"},
    template = '<select>' +
                    '<option value="1">1</option>' +
                    '<option value="2">2</option>' +
                    '<option value="3">3</option>' +
                '</select>';

var html = Mustache.to_html(template, data);

$(html).appendTo('body');

回答by Matt Ball

The valattribute doesn't work, because a <select>takes its value from the <option>s which have the selectedattribute. I'm not very familar with Mustache, but this shouldwork:

val属性不起作用,因为 a<select><option>具有该selected属性的s 中获取其值。我对 Mustache 不是很熟悉,但这应该有效:

// snip...        
var html = Mustache.to_html(template, data);
$(html)
    .find('option[value=3]').attr('selected', true)
    .end().appendTo('body');

I think that the template you're using is not idiomatic Mustache — it's too coarse grained; you're not actually templatinganything. Something like this might be more Mustache-y:

我认为您使用的模板不是惯用的 Mustache — 它的粒度太粗;你实际上并没有在做任何模板。像这样的东西可能更像胡子:

var template = '<select>{{#options}}' +
                   '<option value="{{val}}" {{#sel}}selected{{/sel}}>' + 
                       '{{txt}}' + 
                   '</option>' + 
               '{{/options}}</select>',

    data = {options: [
        {val: 1, txt: 'uno'},
        {val: 2, txt: 'dos'},
        {val: 3, txt: 'tres', sel: true}
    ]};

var html = Mustache.to_html(template, data);

$(html).appendTo('body');

Demo →

演示 →

回答by imperator

if you do not want to modify the array or DOM tree afterwards you can use a function:

如果您不想在之后修改数组或 DOM 树,您可以使用一个函数:

var selval=3; // select 3
var template = '<select>{{#options}}' +
                   '<option value="{{val}}" {{selected}}>{{txt}}</option>' + 
               '{{/options}}</select>';
var data={
    options: [
        {val: 1, txt: 'one'},
        {val: 2, txt: 'two'},
        {val: 3, txt: 'three'}
    ],
    selected: function() {
         if (this.val==selval) return "selected";
         return "";
    }
};


var html = Mustache.to_html(template, data);

回答by Fran?ois Dispaux

I use this hack to keep it simple:

我使用这个 hack 来保持简单:

buildOptions = function(object) {
    for (var i in object) {
        object[i + '=' + object[i]] = true;
    }
    return object;
}

In this way, you can transform this kind of data:

通过这种方式,您可以转换此类数据:

{
    field1: 'abc',
    field2: 'xyz' 
}

With this kind of Mustache Template:

使用这种胡子模板:

<select name="field1">
    <option {{#field1=abc}}selected{{/field1=abc}}>abc</option>
    <option {{#field1=def}}selected{{/field1=def}}>def</option>
    <option {{#field1=ghi}}selected{{/field1=ghi}}>ghi</option>
</select>
<select name="field2">
    <option {{#field2=uvw}}selected{{/field2=uvw}}>uvw</option>
    <option {{#field2=xyz}}selected{{/field2=xyz}}>xyz</option>
</select>

Like this:

像这样:

html = Mustache.to_html(template, buildOptions(data));

Which still really easy to read! The only caveat is that you can't have a '.' in your values.

这还是很容易阅读的!唯一的警告是你不能有一个 '.' 在你的价值观中。

回答by Jonathas Costa

I little bit late, I know, just for future reference:

我知道有点晚了,仅供参考:

<script>

var templates = {
    'dropbox': '{{#options}}{{>option}}{{/options}}',
    'option': '<option value="{{value}}"{{#selected}} selected="selected"{{/selected}}>{{text}}</option>'
};

var data = {
    'options': [
        { 'value': '1', 'text': 'One' },
        { 'value': '2', 'text': 'Two', 'selected': true },
        { 'value': '3', 'text': 'Three' }
    ]
};

$('#number').append(Mustache.render(templates.dropbox, data, templates));

</script>

<select id='number' name='number'>
    <option value="0">Choose a number</option>
</select>