2

这是 JSON 数组:

{
"profile": [
    {
        "ID": 343,
        "gender": "female",
        "from": "Olivia"
    },
    {
        "ID": 4543,
        "gender": "female",
        "from": "Meagen"
    },
    {
        "ID": 787,
        "gender": "male",
        "from": "Aaron"
    }
]
}

这有效,它输出数组中的所有对象......

{{#profile}}

{{from}} {{gender}}

{{/profile}}

输出看起来像......

Olivia female
Meagen female
Aaron male

但我的目标是只循环那些性别等于女性的人。就像是...

{{#profile gender="female"}}

{{from}} {{gender}}

{{/profile}}

...并让输出看起来像...

Olivia female
Meagen female

几天来,我一直在努力寻找答案。我错过了什么还是我偏离了轨道?

4

1 回答 1

6

我看到两个选项:

  1. 在处理数据之前过滤数据 Handlebars。
  2. 使用自定义助手来处理模板中的逻辑。

第一个非常简单。

第二个取决于你想怎么做。您可以添加一个“如果相等”的助手:

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

并在您的模板中执行此操作:

{{#profile}}
    {{#if_eq gender "female"}}
        {{from}} {{gender}}
    {{/if_eq}}
{{/profile}}

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

或者您可以通过各种方式编写自己的迭代器:

Handlebars.registerHelper('each_female', function(list, opts) {
    var i, result = '';
    for(i = 0; i < list.length; ++i)
        if(list[i].gender == 'female')
            result = result + opts.fn(list[i]);
    return result;
});

{{#each_female profile}}
    {{from}} {{gender}}
{{/each_female}}

或者更笼统一些:

Handlebars.registerHelper('each_when', function(list, k, v, opts) {
    console.log(arguments);
    var i, result = '';
    for(i = 0; i < list.length; ++i)
        if(list[i][k] == v)
            result = result + opts.fn(list[i]);
    return result;
});

{{#each_when profile "gender" "female"}}
    {{from}} {{gender}}
{{/each_when}}

演示: http: //jsfiddle.net/ambiguous/E4jTs/,http : //jsfiddle.net/ambiguous/AkZxN/

如果您想要更接近您建议的语法,请参阅有关 Hash Arguments 的精美手册。

于 2012-10-18T17:20:12.137 回答