私はテンプレートアプローチを使用することを好みます。これは、オプションタグ自体のレイアウトが、JavaScriptヘルパーではなく、ハンドルバーテンプレート(誰かがそれを探す可能性がある場所)で指定されていることを意味します。ブロックヘルパー内のテンプレートはヘルパースクリプトに渡され、options.fn()を呼び出すことで使用できます。その後、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は、aStutusList[loopIndex][ statusCode ]であるmyStatusと一致するかどうかを確認するためにテストするaStatusListオブジェクト内の文字列プロパティ名です。
- 文字列オプションプロパティ(この場合はstatusCode)はオブジェクトにのみ必要です-オプションリストは(文字列を含むオブジェクトの代わりに)文字列の配列にすることもできます。その場合、3番目のプロパティ'statusCode'を省略できます。ヘルパーは、オブジェクトのどのプロパティを再度テストするか。そのプロパティに合格しない場合は、リストアイテム自体を再度テストします。
- sSelectedOptionValueが渡されない場合、選択された項目を設定せずにリストが作成されます。これにより、 {{#each}}ヘルパーを使用する場合とほぼ同じようにリストが生成されます