0

我正在使用以下助手来允许我进行条件比较:

Handlebars.registerHelper("ifCond", function (v1, operator, v2, options) {
  switch (operator) {
  case "==":
    return (v1 == v2) ? options.fn(this) : options.inverse(this);
  case "===":
    return (v1 === v2) ? options.fn(this) : options.inverse(this);
  case "<":
    return (v1 < v2) ? options.fn(this) : options.inverse(this);
  case "<=":
    return (v1 <= v2) ? options.fn(this) : options.inverse(this);
  case ">":
    return (v1 > v2) ? options.fn(this) : options.inverse(this);
  case ">=":
    return (v1 >= v2) ? options.fn(this) : options.inverse(this);
  default:
    return options.inverse(this);
  }
});

然后我的模板设置如下:

<select name="mode">
    {{#each data.modes}}
    <option {{#ifCond data.curmode '==' this}} selected="selected" {{/ifCond}} value="{{this}}">{{this}}</option>
    {{/each}}
</select>

我传入的data是一个包含modes(可用模式的平面数组,字符串)的对象,以及curmode包含当前选定模式的字符串。

据我所知,一切都被很好地传递了——我可以正确地显示data.curmode和每个data.modes填充。但是,它没有输出selected="selected"匹配。

4

1 回答 1

1

当您使用迭代器时,例如#each,块内的所有内容都相对于当前元素进行引用。所以,如果你这样说:

{{#each a}}
    {{x}}
{{/each}}

Handlebars 将在模板x的当前值中a而不是在全局命名空间中查找。{{#each data.modes}}因此,如果您想获得最高级别,则需要查看价值之外的内容data.curmode

<select name="mode">
    {{#each data.modes}}
    <option {{#ifCond ../data.curmode '==' this}} ...
    {{/each}}
</select>

../你上一层楼。

演示:http: //jsfiddle.net/ambiguous/Sz6VT/

于 2013-07-27T16:46:57.480 回答