2

尝试实现一个允许您修改现有数据库记录的弹出窗口。作为其中的一部分,我有几个选择框需要预先填充现有的选择。我首先想到的似乎更难做到。这是我作为模板的片段

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

我遇到的问题是在isSelectedHour模板函数中,因为this不能有两个定义(第一个是#each 值,第二个是记录对象)。我需要将#each 循环中的值与我的记录中的值进行比较,我想不出一种优雅的方式来做到这一点。我总是可以将我的记录值设置为 Session 变量,但这太难了。

有没有一种好的,非hacky的方法来做到这一点?

4

2 回答 2

3

我遇到了同样的问题,令我惊讶的是,有一个很好的方法。您确实可以访问模板部分中的外部上下文,并且可以使用它将 this 传递给辅助函数的值。我会重写你的代码如下:

<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 助手来处理这个问题。如果有人想做类似的事情,这里是帮助代码:

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 回答