我有一个Ember.js ArrayController和一些看起来像这样的把手代码
<p>{{length}} {{pluralize length "thing"}}</p>
然后我有一个看起来像
的车把帮手Handlebars.registerHelper('pluralize', function(count, str){
debugger;
return (count > 1 ? str+"s" : str);
}
);
当调试器中断时,我观察到count = 'length'
不是像我期望的那样的数字。
那是什么给出的?什么是完成我明显任务的正确方法。
答案 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