如何在Handlebars中检查值是否为对象?

4

jsBin 示例

这是我的小模型:

var stuff = [{
  there: 'blah',
  that: {
    one: 'bbb',
    two: 'ccc'
  }
}];

首先,对于下面的模板,我不明白为什么第一个 {{@key}} 没有输出任何内容而第二个有。

{{#each this}}
  {{@key}}
  {{#each that}}
    {{@key}}
  {{/each}}
{{/each}}

更重要的是,我正在尝试使用这个模板和一个帮助程序来检查一个值是对象还是字符串,并迭代打印键或只打印键。

{{#each this}}
  {{#if isObj this}}
    {{#each that}}
      {{@key}}
    {{/each}}
  {{else}}
    {{@key}}
  {{/if}}
{{/each}}

助手:

Handlebars.registerHelper('isObj', function(thing) {
  return $.type(thing) === 'object';
});

要获取数组迭代的索引,您可以使用{{@index}},对于对象键,您可以使用{{@key}}。通常您应该知道将什么传递给模板。如果您想创建一个像isObj这样的帮助程序,则应像这样使用它:{{#isObj this}} ... {{else}} ... {{/isObj}}。有关更多详细信息,请参见handlebars-条件语句 - t.niese
1个回答

12
第一个问题我能回答,你应该使用{{@index}}而不是{{@key}},因为你正在遍历一个数组。我正在研究第二个问题。
{{#each this}}
  key: {{@index}}
  {{#each that}}
    key1: {{@key}}
  {{/each}}
{{/each}}

对于第二部分b,看起来您需要注册一个新的辅助函数,因为它不能从另一个函数中返回。您的块助手将类似于(基本上从这里偷了一下):

Handlebars.registerHelper('ifObject', function(item, options) {
  if(typeof item === "object") {
    return options.fn(this);
  } else {
    return options.inverse(this);
  }
});

现在将您的模板更改为以下内容:

{{#each this}}
  {{#ifObject this}}
    {{#each that}}
      {{@key}}
    {{/each}}
  {{else}}
    {{@key}}
  {{/ifObject}}
{{/each}}

这在 tryhandlebars.com 上运行正常,同时也 更新了你的 jsbin,希望能有所帮助!


块不是函数,我需要在模板中传递它吗? - dezman
糟糕,我忘记在那个辅助函数中考虑 else 情况了。 - megawac
@RobertSadler 我更新了这个部分 - 这基本上是从 #if 如何工作中复制的。 - megawac
嗯,我正在处理 http://jsbin.com/orefASi/1/edit -- 它只输出了 'one two',我认为我想要的是 'there one two'。 - dezman
这种策略会导致通过它传递的任何字符串都返回为空对象。当我尝试在验证它不是一个对象之后在一个else块中渲染this时,它会渲染[object Object],并且记录它返回了{}.在输入此注释后立即意识到我的错误。我将函数更改为箭头语法,因此失去了this绑定。为了让其他人遇到此问题时能够看到,我在此处留下我的耻辱。 - Ned

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接