2

我正在循环一个 ArrayController 的内容,其内容设置为 RecordArray。每条记录都是 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 方法。该方法应返回不带“控制器”后缀的控制器名称,即客户端而不是客户端控制器。仅itemControllerClass在数组控制器中设置属性目前似乎不起作用。

lookupItemController: function( object ) {
        return 'client';
    },
4

2 回答 2

2

这是最近添加到主:https ://github.com/emberjs/ember.js/commit/2a75cacc30c8d02acc83094b47ae8a6900c0975b

在撰写本文时,它还没有出现在任何已发布的版本中。它很可能是 1.0.0.pre.3 的一部分。

于 2013-01-10T05:18:21.523 回答
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 来解决这个问题,但这也还没有发布。

于 2013-01-10T12:26:10.243 回答