handlebars.js-根据助手输出选择循环

时间:2019-03-15 15:27:18

标签: loops handlebars.js

在我的页面中,我的loop中有context.js的两个 set

set_1: [
    {title: 'Set 1'},
    {title: 'Set 1'},
    {title: 'Set 1'}
],

set_2: [
    {title: 'Set 2'},
    {title: 'Set 2'},
    {title: 'Set 2'}
]

目前我正在做

{{#each set_1}}
   {{title}}
{{/each}}

{{#each set_2}}
   {{title}}
{{/each}}

我要实现的目标基于url parameters能够选择要显示的 set 。例如:domain.com/?set=1domain.com/?set=2,并基于此,将在loop中设置 right 集,并显示该内容。

我试图为它创建一个如下的助手,但是它没有给出错误或显示内容:

function getUrlParam(name) {
  var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href);
  return (results && results[1]) || undefined;
}
var s   = getUrlParam('set');
Handlebars.registerHelper('selectSet', function(){
  if (s == 1){
    return 'set_1'
  } else if (s == 2) {
    return 'set_2'
  } else {
    return 'set_1'
  }
});

在我的html页上,我这样做:

{{#each selectSet}}
    {{title}}
{{/each}}

感谢您的任何帮助,并在此先感谢您!

2 个答案:

答案 0 :(得分:0)

不支持将此类功能链接到助手:https://github.com/wycats/handlebars.js/issues/304。如果您想要这样的事情,则必须编写一个帮助程序,该帮助程序会将第一个帮助程序生成的结果链接到第二个帮助程序(但是请忽略#each)。

在帖子中,您将找到有关编写此类帮助程序的代码:

Handlebars.registerHelper('chain', function () {
    var helpers = [], value;
    $.each(arguments, function (i, arg) {
        if (Handlebars.helpers[arg]) {
            helpers.push(Handlebars.helpers[arg]);
        } else {
            value = arg;
            $.each(helpers, function (j, helper) {
                value = helper(value, arguments[i + 1]);
            });
            return false;
        }
    });
    return value;
});

答案 1 :(得分:0)

我设法通过lookup具有以下内置功能handlebarjs实现了这一目标:

function getUrlParam(name) {
  var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href);
  return (results && results[1]) || undefined;
}
var s   = getUrlParam('set');
Handlebars.registerHelper('selectSet', function(){
  if (s == 1){
    return 'set_1'
  } else if (s == 2) {
    return 'set_2'
  } else {
    return 'set_1'
  }
});

// In my HTML
{{#each (lookup . (selectSet))}}
   {{name}}
{{/each}}