我有一个把手模板,我嵌入在我的html页面中.有一个select元素,其中包含已呈现的所有可用选项.在渲染模板时,如何设置选择列表的选定值?
<script id="my-template" type="text/x-handlebars-template">
<div id="my-modal">
<form action="/TestAction" method="post">
<input id="MyId" name="MyId" type="hidden" value="{{MyId}}" />
<label for="Test">Test: (optional)</label>
<select id="Test" name="Test">
<option value="">-- Choose Test --</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
</form>
</div>
</script>
Run Code Online (Sandbox Code Playgroud)
Mat*_*ron 26
如果您不希望将该选项构建为帮助程序的一部分,则可以使用小型自定义句柄助手和父上下文的组合,使用以下../
语法表示:
先写好帮手:
Handlebars.registerHelper('selected', function(option, value){
if (option === value) {
return ' selected';
} else {
return ''
}
});
Run Code Online (Sandbox Code Playgroud)
然后在模板中调用助手并传入each
循环内的父上下文以进行检查selectedState
{{#each states}}
<option value="{{this}}" {{selected this ../selectedState}}>{{this}}</option>
{{/each}}
Run Code Online (Sandbox Code Playgroud)
我把{{#each}}
帮助器作为灵感,并编写了一个自定义帮助程序,它执行相同的操作:循环遍历列表,并不断将参数的内容附加到输出字符串.(从这里:把手挡住帮手)
在这种情况下,我不会传递一大块模板HTML作为函数的options
参数,就像使用时一样{{#each}}
.相反,我只是<option>
通过强力建立标签,并测试context
列表的每次迭代.最后,我返回<option></option>
一大串标签,希望其中一个标签selected="selected"
.
功能:
Handlebars.registerHelper('options_selected', function(context, test) {
var ret = '';
for (var i = 0, len = context.length; i < len; i++) {
var option = '<option value="' + context[i]+'"';
if (test.toLowerCase() == context[i].toLowerCase()) {
option += ' selected="selected"';
}
option += '>'+ Handlebars.Utils.escapeExpression(context[i]) + '</option>';
ret += option;
}
return new Handlebars.SafeString(ret);
});
Run Code Online (Sandbox Code Playgroud)
正在使用的标签:
<script id="form-state" type="text/x-handlebars-template">
<select name="state">
{{{options_selected states selectedState}}}
</select>
</script>
Run Code Online (Sandbox Code Playgroud)
请建议任何可以改善这一点的编辑,谢谢!
这是一个解决方案(基于 EmberJS 构建以简化 JS 部分)
我对您的示例进行了一些重构,以获取建议值的对象,顺便说一句,它可以携带selected
......
模板部分:
<script type="text/x-handlebars" data-template-name="my-template">
<div id="my-modal">
<form action="/TestAction" method="post">
<input id="MyId" name="MyId" type="hidden" value="{{MyId}}" />
<label for="Test">Test: (optional)</label>
<select id="Test" name="Test">
<option value="">-- Choose Test --</option>
{{#each values}}
<option {{bindAttr value="id" selected="selected"}}>{{label}}</option>
{{/each}}
</select>
</form>
</div>
</script>
Run Code Online (Sandbox Code Playgroud)
JS部分:
App.MyView = Ember.View.extend
templateName: 'my-template'
MyId: 42
values: [{
id: 1,
label: '1'
}, {
id: 2,
label: '2'
}, {
id: 3,
label: '3',
selected: true
}, {
id: 4,
label: '4'
}]
Run Code Online (Sandbox Code Playgroud)
你可以尝试一下@http: //jsfiddle.net/MikeAski/uRUc3/