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}}
在原始车把2.0中工作?
编辑
在这里添加了一个赏金,用于基于https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/lib/ember_compat_handlebars.js的手柄扩展,为我们提供了支持。很明显它没有内置于车把。同样清楚的是Ember能够扩展这一点。
答案 0 :(得分:4)
非上下文切换每个帮助程序是Ember中引入的帮助程序,它不是核心车把库的一部分。你无法使用普通的ol'车把。
答案 1 :(得分:4)
这说明了如何做到这一点。但请注意,它在编译时需要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]}));
答案 2 :(得分:2)
如果我理解你的问题,我相信这会有效。
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]}));
答案 3 :(得分:2)
也许你根本不需要实现这一点,因为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。