我更喜欢使用模板方法。我的意思是选项标签本身的布局是在车把模板中指定的(有人可能会在其中查找它),而不是在 javascript 帮助程序中。块助手中的模板被传递到助手脚本中,可以通过调用options.fn()使用,然后使用您在助手中所做的任何脚本更改。
模板:
<select>
{{#optionsList aStatusList sCurrentStatusCode 'statusCode'}}
<option {{isSelected}} value="{{statusCode}}">{{statusName}}</option>
{{/optionsList}}
</select>
稍微修改的数据(不是必需的,但对我来说更“真实世界”)
var myOrder =
{
"id" : 1,
"name" : "World",
"statusName" : "OverDue", /* status should NOT be here! */
"statusCode" : "1",
"date" : "2012-12-21"
}
var sCurrentStatusCode = myOrder.statusCode;
var aStatusList =
[
{
"statusName" : "Node",
"statusCode" : 0
},
{
"statusName" : "Overdue",
"statusCode" : 1
},
{
"statusName" : "Completed",
"statusCode" : 2
},
{
"statusName" : "Sent to Payer",
"statusCode" : 3
}
]
Javascript注册助手:
Handlebars.registerHelper( 'optionsList',
function ( aOptions, sSelectedOptionValue, sOptionProperty, options )
{
var out = "";
for ( var i = 0, l = aOptions.length; i < l; i++ )
{
aOptions[ i ].isSelected = '';
if( ( sOptionProperty != null && sSelectedOptionValue == aOptions[ i ][ sOptionProperty ] ) || ( sSelectedOptionValue == aOptions[ i ] ) )
{
aOptions[ i ].isSelected = ' selected="selected" ';
}
out = out + options.fn( aOptions[ i ] );
}
return out;
} );
optionsList是我选择给这个助手命名的
aStatusList状态对象数组包含多个属性,包括状态值/名称(在大多数情况下,我遇到的这将是状态代码而不是存储的状态名称)
sCurrentStatus是先前选择的状态代码(不是值),是我希望在此生成的选项列表中选择的选项值。
statusCode是 aStatusList 对象中的字符串属性名称,我将测试它是否与 myStatus 匹配,即 aStutusList[ loopIndex ][ statusCode ]
- 字符串选项属性(在这种情况下为 statusCode )仅对对象是必需的 - 选项列表也可以是字符串数组(而不是反过来包含字符串的对象),在这种情况下,您可以省略第三个属性“statusCode”,它告诉助手要再次测试对象的什么属性。如果您不通过该属性,它只会测试列表项本身。
- 如果 sSelectedOptionValue 未通过,则将生成列表而不将任何项目设置为选中。这将生成与使用{{#each}}帮助器几乎相同的列表