【问题标题】:Force a controller to always act as a proxy to a model in Ember强制控制器始终充当 Ember 中模型的代理
【发布时间】:2013-01-10 01:38:13
【问题描述】:

我正在循环一个 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';
    },

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

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

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

    【讨论】:

    • 太好了,我正在使用主版本。我会试一试。我很高兴我的问题符合整个问题的讨论:)
    【解决方案2】:

    如果您只是在格式化之后,另一种可能性是制作车把助手。例如,您可以实现自己的 {{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 提供的解决方案将更加灵活——例如让您计算控制器中的余额,而不是简单地格式化单个值。

    编辑:

    我应该提到一个警告,因为它并不明显:上述解决方案不会创建 bound 车把助手,因此不会反映对基础模型值的更改。应该有一个 registerBoundHelper 已经提交给 Ember.js 来解决这个问题,但它还没有发布。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-29
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      相关资源
      最近更新 更多