如何添加“每个”以在车把中工作

时间:2015-01-05 01:20:23

标签: javascript ember.js handlebars.js

Ember正在迁移到non-context switching #each个助手。对于兼容性部件,我需要从原始把手做同样的事情。

然而trivial attempt fails

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能够扩展这一点。

4 个答案:

答案 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]}));

http://jsbin.com/tebayupobu/4/edit

答案 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