我正在循环遍历其内容设置为RecordArray的ArrayController的内容。每条记录都是DS.Model,比如Client
{{# each item in controller}}
{{item.balance}}
{{/each}}
balance是Client模型的属性,对item.balance的调用将直接从模型中获取属性。我想应用一些格式来平衡以货币格式显示。这样做的简单方法是将一个计算属性balanceMoney添加到Client对象并在那里进行格式化:
App.Client = DS.Model({
balance: DS.attr('balance'),
balanceMoney: function() {
// format the balance property
return Money.format(this.get('balance');
}.property('balance')
});
这很好地用于了balanceMoney计算属性的正确位置,但客户端控制器而不是客户端模型。我的印象是Ember首先在控制器中查找属性,然后尝试在模型中检索它们(如果没有找到)。这一切都不会发生在这里,对item.balanceMoney的调用将被忽略,永远不会到达控制器。
是否有可能以某种方式配置控制器以在所有情况下始终作为模型的代理。
更新 - 使用emberjs主存储库中的最新版本,您可以配置阵列控制器,通过覆盖ArrayController中的lookupItemController方法,通过控制器代理解析记录的方法。该方法应返回没有'controller'后缀的控制器名称,即client而不是clientController。仅在阵列控制器中设置itemControllerClass
属性似乎暂时不起作用。
lookupItemController: function( object ) {
return 'client';
},
答案 0 :(得分:2)
这是最近添加到主人:https://github.com/emberjs/ember.js/commit/2a75cacc30c8d02acc83094b47ae8a6900c0975b
在撰写本文时,它不在任何已发布的版本中。它很可能是1.0.0.pre.3的一部分。
答案 1 :(得分:1)
如果您只是在格式化之后,另一种可能性就是制作一个把手帮手。例如,您可以实现自己的{{formatMoney item.balance}}帮助程序。
对于更一般的东西,我做了一个包装sprintf
实现(选择其中一个):
Ember.Handlebars.registerHelper('sprintf', function (/*arbitrary number of arguments*/) {
var options = arguments[arguments.length - 1],
fmtStr = arguments[0],
params = Array.prototype.slice.call(arguments, 1, -1);
for (var i = 0; i < params.length; i++) {
params[i] = this.get(params[i]);
}
return vsprintf(fmtStr, params);
});
然后你可以做{{sprintf "$%.2f" item.balance}}
。
然而,@ luke-melia给出的解决方案将更灵活 - 例如让你计算控制器中的余额,而不是简单地格式化单个值。
修改强>
我应该提到的一个警告,因为它并不明显:上述解决方案不会创建绑定手柄帮助程序,因此不会反映对基础模型值的更改。应该有一个registerBoundHelper
已经提交给Ember.js来解决这个问题,但是它还没有发布。