Handlebar.js if语句不起作用

时间:2012-12-10 09:42:52

标签: backbone.js if-statement handlebars.js

我在列表表模板中添加了一个组合框,并且我想根据我模型中的数据库渲染组合框,所以什么是错的?请帮助..

<script type="text/x-handlebars-template" id="listItemTmpl">
<tr>                             
    <td>{{partNo}}</td>
    <td>
         <select name="selectCombo" id="selectCombo">
                {{#each chks}}
                <option value='{{myModel.id}}' {{#if(this.id==myModel1.status)}}selected{{/if}}>{{myModel1.name}}</option>
                {{/each}}
            </select>
    </td>
</tr>

</script>

ı有两种型号; 一个是,

 myModel1=Backbone.Model.extend({
    url:url,
    defaults:{
      name:"",
      status:""
  }
 });

其他是;

myModel=Backbone.Model.extend({
  url:url,
  defaults:{

  }
});

3 个答案:

答案 0 :(得分:4)

问题是,车把不起作用。表达式{{#if(this.id==myModel1.status)}}不是有效的句柄if-block。

Handlebars是一个语义的声明性模板引擎。它不支持任意javascript表达式。您可以使用#if块检查的唯一事项是,是否真实(不是falseundefinednull""或{{1} })。

首选方法是在渲染模板之前评估条件,并使用viewmodel将结果传递给模板。在您的情况下,您可以向[]数组中的每个对象添加isSelected属性,并使用

在模板中对其进行评估
chks

有关如何使用把手的示例,请参阅handlebars.js documentation

答案 1 :(得分:1)

一般情况下,您应使用isSelected标记和fencliff's answer标记。但是,有时添加额外标志不是一个合理的选择,如果是这种情况,您可以添加{{#ifeq}}帮助器。像这样简单:

Handlebars.registerHelper('ifeq', function(a, b, block) {
    return a == b ? block() : block.inverse();
});

然后在模板中:

<option value='{{myModel.id}}' {{#ifeq id myModel1.status}}selected{{/ifeq}}>{{myModel1.name}}</option>

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

答案 2 :(得分:1)

只是一个更新。最新版本的Handlebars使用了block.fn()而不是block()。否则可能会抛出错误。

Handlebars.registerHelper('ifeq', function(a, b, block) {
    return a == b ? block.fn() : block.inverse();
});