handlebars.js - Select 基于辅助输出的循环

handlebars.js - Select loop based on helper output

在我的页面中,我的 context.js

中有 2 set of loop
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能够select其中设置来显示。比如:domain.com/?set=1 & domain.com/?set=2 并以此为基础, set 将设置在loop 并显示。

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

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}}

感谢任何帮助,并提前致谢!

不支持链接助手的此类功能:https://github.com/wycats/handlebars.js/issues/304。如果你想要这样的东西,你必须编写一个助手,它将第一个助手产生的结果链接到第二个助手(但忘记#each)。

在 post 中,您会找到有关编写此类助手的代码:

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;
});

我设法通过 handlebarjs 具有的内置函数 lookup 实现了这一点,如下所示:

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}}