1

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

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

然后我有一个车把助手,看起来像

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

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

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

4

3 回答 3

5

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

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

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}}其他解决方案所需的 hack,这意味着添加或删除其他对象将相应地更新值。

于 2013-05-15T22:49:24.747 回答
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);
});

编辑

这是一个工作小提琴

编辑 2

这是您的工作更新小提琴

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

希望能帮助到你

于 2013-05-15T19:45:25.860 回答
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

于 2013-07-30T20:23:20.347 回答