使用Handlebars.js,如何使用JSON文件中的值循环数据

2 json handlebars.js

这是JSON数组:

{
"profile": [
    {
        "ID": 343,
        "gender": "female",
        "from": "Olivia"
    },
    {
        "ID": 4543,
        "gender": "female",
        "from": "Meagen"
    },
    {
        "ID": 787,
        "gender": "male",
        "from": "Aaron"
    }
]
}
Run Code Online (Sandbox Code Playgroud)

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

{{#profile}}

{{from}} {{gender}}

{{/profile}}
Run Code Online (Sandbox Code Playgroud)

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

Olivia female
Meagen female
Aaron male
Run Code Online (Sandbox Code Playgroud)

但我的目标是只圈出那些性别与女性相等的人.就像是...

{{#profile gender="female"}}

{{from}} {{gender}}

{{/profile}}
Run Code Online (Sandbox Code Playgroud)

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

Olivia female
Meagen female
Run Code Online (Sandbox Code Playgroud)

几天来,我一直在努力寻找答案.我错过了一些东西还是偏离轨道?

mu *_*ort 5

我看到两个选择:

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

第一个很直接.

第二个取决于你想要怎么做.你可以添加一个"if equal"帮助器:

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

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

{{#profile}}
    {{#if_eq gender "female"}}
        {{from}} {{gender}}
    {{/if_eq}}
{{/profile}}
Run Code Online (Sandbox Code Playgroud)

演示: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}}
Run Code Online (Sandbox Code Playgroud)

或者更一般:

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}}
Run Code Online (Sandbox Code Playgroud)

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

如果您想要更接近您提出的语法,请参阅Hash Arguments 的精细手册.