如何添加 "each in" 以在车把中工作
How do you add the "each in" to work in handlebars
Ember 正在迁移到 non-context switching #each
助手。对于兼容性部分,我需要从原始车把上做同样的事情。
var f = Handlebars.compile("{{#each numbers}}{{this}}{{/each}}");
console.log(f({numbers: [1,2,3]}));
// works
var f2 = Handlebars.compile("{{#each number in numbers}}{{number}}{{/each}}");
console.log(f2({numbers: [1,2,3]}));
// fails
如何让 {{#each number in numbers}}
在 raw handlebars 2.0 中工作?
编辑
在此处添加了赏金,用于基于 https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/lib/ember_compat_handlebars.js 的车把扩展,它为我们提供了……支持。很明显它没有内置在车把中。也很明显 Ember 能够扩展它。
每个助手的非上下文切换是 Ember 中引入的助手,它不是核心 handlebars 库的一部分。您将无法将它与普通的 ol' 车把一起使用。
这说明了如何做到这一点。但请注意,它在编译时需要 stringParams
标志,这会改变所有助手的调用方式,因此这可能会破坏所有其他助手,除非您提供它们的 stringParams
兼容版本。
Handlebars.registerHelper('each', function(localName,inKeyword,contextName,options){
var list = this[contextName];
var output = "";
var innerContext = Object.create(this);
for (var i=0; i<list.length; i++) {
innerContext[localName] = list[i];
output += options.fn(innerContext);
}
return output;
});
var f = Handlebars.compile("{{#each number in numbers}}{{number}}{{/each}}", {
stringParams: true
});
console.log(f({numbers: [1,2,3]}));
如果我理解正确,我相信这会奏效。
var hbs = "{{#each this}}{{this}}{{/each}}";
var f3 = Handlebars.compile(hbs);
console.log(f3({numbers: [1,2,3]}));
console.log(f3({numbers: [3,2,1]}));
也许您根本不需要实现这一点,因为 Handlebars 正在转向非上下文切换助手的块参数。 Ember 已经在 1.10 Beta 中使用块参数(您可以在 release notes 中阅读块参数)。
您现在可以使用最新版本的 Handlebars 通过新的块参数语法获得非上下文切换:
var f = Handlebars.compile("{{#each numbers}}{{this}}{{/each}}");
console.log(f({numbers: [1,2,3]}));
var f = Handlebars.compile("{{#each numbers as |number|}}{{number}}{{/each}}");
console.log(f({numbers: [1,2,3]}));
控制台:
"123"
"123"
已使用新语法更新 JSBin。
Ember 正在迁移到 non-context switching #each
助手。对于兼容性部分,我需要从原始车把上做同样的事情。
var f = Handlebars.compile("{{#each numbers}}{{this}}{{/each}}");
console.log(f({numbers: [1,2,3]}));
// works
var f2 = Handlebars.compile("{{#each number in numbers}}{{number}}{{/each}}");
console.log(f2({numbers: [1,2,3]}));
// fails
如何让 {{#each number in numbers}}
在 raw handlebars 2.0 中工作?
编辑
在此处添加了赏金,用于基于 https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/lib/ember_compat_handlebars.js 的车把扩展,它为我们提供了……支持。很明显它没有内置在车把中。也很明显 Ember 能够扩展它。
每个助手的非上下文切换是 Ember 中引入的助手,它不是核心 handlebars 库的一部分。您将无法将它与普通的 ol' 车把一起使用。
这说明了如何做到这一点。但请注意,它在编译时需要 stringParams
标志,这会改变所有助手的调用方式,因此这可能会破坏所有其他助手,除非您提供它们的 stringParams
兼容版本。
Handlebars.registerHelper('each', function(localName,inKeyword,contextName,options){
var list = this[contextName];
var output = "";
var innerContext = Object.create(this);
for (var i=0; i<list.length; i++) {
innerContext[localName] = list[i];
output += options.fn(innerContext);
}
return output;
});
var f = Handlebars.compile("{{#each number in numbers}}{{number}}{{/each}}", {
stringParams: true
});
console.log(f({numbers: [1,2,3]}));
如果我理解正确,我相信这会奏效。
var hbs = "{{#each this}}{{this}}{{/each}}";
var f3 = Handlebars.compile(hbs);
console.log(f3({numbers: [1,2,3]}));
console.log(f3({numbers: [3,2,1]}));
也许您根本不需要实现这一点,因为 Handlebars 正在转向非上下文切换助手的块参数。 Ember 已经在 1.10 Beta 中使用块参数(您可以在 release notes 中阅读块参数)。
您现在可以使用最新版本的 Handlebars 通过新的块参数语法获得非上下文切换:
var f = Handlebars.compile("{{#each numbers}}{{this}}{{/each}}");
console.log(f({numbers: [1,2,3]}));
var f = Handlebars.compile("{{#each numbers as |number|}}{{number}}{{/each}}");
console.log(f({numbers: [1,2,3]}));
控制台:
"123"
"123"
已使用新语法更新 JSBin。