将变量传递给ember把手

时间:2013-05-15 18:59:55

标签: ember.js handlebars.js

我有一个Ember.js ArrayController和一些看起来像这样的把手代码

<p>{{length}} {{pluralize length "thing"}}</p>

然后我有一个看起来像

的车把帮手
Handlebars.registerHelper('pluralize', function(count, str){
    debugger;
    return (count > 1 ? str+"s" : str);
  }
); 

当调试器中断时,我观察到count = 'length'不是像我期望的那样的数字。

那是什么给出的?什么是完成我明显任务的正确方法。

3 个答案:

答案 0 :(得分:5)

在这里工作小提琴。 http://jsfiddle.net/MwTuw/2/

诀窍是使用Ember.registerBoundHelper将所有相关数据作为函数的最终参数传递。

Ember.Handlebars.registerBoundHelper('pluralize', function (count) {
  var options = Array.prototype.pop.call(arguments);
  var string = options.data.properties[1];
  return (count > 1 ? string+"s" : string);
});

这将删除其他解决方案所需的{{if controller.length}}黑客,这意味着添加或删除其他对象将相应地更新该值。

答案 1 :(得分:2)

这个怎么样:

Ember.Handlebars.registerHelper('pluralize', function (property, options) {
  var count = Ember.Handlebars.get(this, property, options);
  var _options = options;
  count = parseInt(count, 10); //to be sure ...
  if (count > 1) {
    _options = _options.concat('s');
  }
  return new Handlebars.SafeString(_options);
});

修改

这是一个有效的fiddle

编辑2

这是您的工作更新fiddle

  

基本上问题是当控制器仍然没有记录时,把手帮助器正在运行,我已经在模板上添加了一个if帮助器来监听controller.length并在它发生变化时触发所以也调用把手助手来解析值。

希望有所帮助

答案 2 :(得分:1)

使用 Ember.registerBoundHelper 将使模板中的所有键值对可用作辅助对象的第二个参数的哈希:

把手模板:

{{orderShow dataOrderBy key1="value1" key2="value2" ... keyN="valueN"}}

使用Javascript:

Ember.Handlebars.registerBoundHelper('orderShow', function(order, options) {
  if(options) {
    for(var prop in options.hash) {
            alert(prop + '="' + options.hash[prop] + '"')
    }
  }

  return order;
}

以下页面末尾描述了此行为:http://handlebarsjs.com/expressions.html