handlebars.js {{#if}} 条件中的长度检查

Length check in a handlebars.js {{#if}} conditional

handlebars 中是否有检查值长度的方法?像这样:

{{#if value.length > 20}
...do something
{{else}}
...do something else
{{/if}}

像下面这样创建 Handlebars 助手:-

Handlebars.registerHelper('checklength', function (v1, v2, options) {
'use strict';
   if (v1.length>v2) {
     return options.fn(this);
  }
  return options.inverse(this);
});

并像这样使用:-

      {{#checklength jobTitle 20}}   //jobtitle is property and 20 is length
             <p>Up to 20</p>
      {{else}}
             <p>Less then 20</p>
      {{/checklength}}

Demo

只是想改进接受的答案,这是非常正确和有帮助的,但是...

与其专门针对某些长度制作它,不如将其制作成大于条件并在其他大于的情况下使用它。

Handlebars.registerHelper('greaterThan', function (v1, v2, options) {
'use strict';
   if (v1>v2) {
     return options.fn(this);
  }
  return options.inverse(this);
});

并像这样使用:

{{#greaterThan jobTitle.length 20}}
  <p>Up to 20</p>
{{else}}
  <p>Less then 20</p>
{{/greaterThan}}

这样你就可以比较很多不同的东西,而不仅仅是长度。

你也可以更进一步,让我们考虑一下,我们可能想要检查某物是否小于某物或等于某物。

  Handlebars.registerHelper('compare', function (v1, operator, v2, options) {
    'use strict';
    var operators = {
      '==': v1 == v2 ? true : false,
      '===': v1 === v2 ? true : false,
      '!=': v1 != v2 ? true : false,
      '!==': v1 !== v2 ? true : false,
      '>': v1 > v2 ? true : false,
      '>=': v1 >= v2 ? true : false,
      '<': v1 < v2 ? true : false,
      '<=': v1 <= v2 ? true : false,
      '||': v1 || v2 ? true : false,
      '&&': v1 && v2 ? true : false
    }
    if (operators.hasOwnProperty(operator)) {
      if (operators[operator]) {
        return options.fn(this);
      }
      return options.inverse(this);
    }
    return console.error('Error: Expression "' + operator + '" not found');
  });

使用上面的帮助器,我们可以比较各种可能发生的情况。

{{#compare jobTitle.length '>' 20}}
  {{#compare jobTitle.length '<=' 100}}
    <p>Greater than 20 and less than or equal 100</p>
  {{else}}
    <p>Greater than 100</p>
  {{/compare}}
{{else}}
  <p>Less than or equal to 20</p>
{{/compare}}

如果您发现很难理解这个助手的工作原理,请尝试阅读 Todd Mottos article 关于使用对象字面量而不是 switch 语句的内容。

不清楚你的value是什么,字符串还是数组?

如果是数组,就不需要帮手了!您可以检查 length 处的项目是否存在:

{{#if items.[20]}}

这是一个工作示例,如果用户有 一个 个项目,而不是多个项目:

{{#if items.[1]}}
You have the following items:
{{#each items}}
* {{this}}
{{/each}}
{{else}}
You have one item: {{items.[0]}}
{{/if}}

http://tryhandlebarsjs.com/ 尝试使用

等示例数据
{
  items: ["foo", "bar"]
}

不需要助手对于在邮件投递服务(Sparkpost、Sendgrid、Mandrill 等)的动态模板中使用 Handlebars 非常重要,这些服务不允许定义助手(尽管 Sparkpost 的语法比 Sendgrid 丰富得多) .