2

既存のデータベース レコードを変更できるポップアップを実装しようとしています。その一環として、既存の選択内容を事前入力する必要があるいくつかの選択ボックスがあります。これは、私が最初に思ったよりも難しいようです。これが私のテンプレートとして持っているもののスニペットです

{{#with myExistingRecord}}
    <select class="myselect">
        {{#each hoursInTheDay}}
            {{#if isSelectedHour}}
                <option selected>{{this}}</option>
            {{else}}
                <option>{{this}}</option>
            {{/if}}
        {{/each}}
    </select>
{{/with}}

私が遭遇する問題は、isSelectedHourテンプレート関数にあります。これthisは、2 つの定義 (最初の #each 値と 2 番目のレコード オブジェクト) を持つことができないためです。#each ループの値と自分のレコードの値を比較する必要がありますが、これを行うエレガントな方法が思いつきません。いつでもレコード値をセッション変数として設定できましたが、それはハックです。

これを行うためのハックではない良い方法はありますか?

4

2 に答える 2

3

私は同じ問題を抱えていましたが、驚いたことに、これには良い方法があります。テンプレート セクションの外部コンテキストにアクセスできます。これを使用して、ヘルパー関数の値にこれを渡すことができます。私はあなたのコードを次のように書き直します:

<template name="myTemplate">
{{#with myExistingRecord}}
    <select class="myselect">
        {{#each hoursInTheDay}}
            <option {{selected ../recordHour}}>{{this}}</option>
        {{/each}}
    </select>
{{/with}}
</template>

次に、ヘルパー関数を用意します。

Template.myTemplate.selected = function(hour) {
    if (hour == currentHour)
        { return "selected ";}
    else 
        { return "";}
};

../ 表記の仕組みの詳細については、こちらを参照してください。

于 2013-01-11T21:45:34.637 に答える
0

最終的に、これを処理する単純なハンドルバー ヘルパーを作成することにしました。誰かが同様のことをしたい場合は、ヘルパー コードを次に示します。

Handlebars.registerHelper('hourOptions', function(selectedHour) {
    var html = '';

    for (var hr = 0; hr < 24; hr++) {
        if (hr === selectedHour)
            html += '<option selected>' + hr + '</option>';
        else
            html += '<option>' + hr + '</option>';
    }

    return new Handlebars.SafeString(html);
});

そして、テンプレートコードは次のようになります

{{#with myExistingRecord}}
    <select class="myselect">
        {{hourOptions mySelectedHour}}
    </select>
{{/with}}
于 2012-11-28T21:08:40.423 に答える