Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js 强制控制器始终充当Ember中模型的代理_Ember.js_Ember Data - Fatal编程技术网

Ember.js 强制控制器始终充当Ember中模型的代理

Ember.js 强制控制器始终充当Ember中模型的代理,ember.js,ember-data,Ember.js,Ember Data,我正在循环一个ArrayController的内容,它的内容被设置为RecordArray。每个记录都是DS.Model,比如客户端 {{# each item in controller}} {{item.balance}} {{/each}} balance是客户端模型的一个属性,对item.balance的调用将直接从模型中获取该属性。我想对余额应用一些格式,以货币格式显示。执行此操作的简单方法是将计算属性balanceMoney添加到客户端对象,并在其中进行格式化: App.Clien

我正在循环一个ArrayController的内容,它的内容被设置为RecordArray。每个记录都是DS.Model,比如客户端

{{# each item in controller}}
{{item.balance}}
{{/each}}
balance是客户端模型的一个属性,对item.balance的调用将直接从模型中获取该属性。我想对余额应用一些格式,以货币格式显示。执行此操作的简单方法是将计算属性balanceMoney添加到客户端对象,并在其中进行格式化:

App.Client = DS.Model({
 balance: DS.attr('balance'),

 balanceMoney: function() {
   // format the balance property
   return Money.format(this.get('balance');
 }.property('balance')
});
这很好地满足了这个目的,余额货币计算属性的正确位置是客户机控制器,而不是客户机模型。我的印象是,首先在控制器中查找余烬属性,然后在没有找到任何内容的情况下尝试在模型中检索它们。但是,这里不会发生任何情况,对item.balanceMoney的调用将被忽略,并且永远不会到达控制器

是否可以以某种方式将控制器配置为在所有情况下始终充当模型的代理

更新-使用来自emberjs主存储库的最新版本,您可以通过覆盖ArrayController中的lookupItemController方法,将阵列控制器配置为通过控制器代理解析记录的方法。该方法应返回不带“controller”后缀的控制器名称,即client而不是clientController。仅仅在数组控制器中设置
itemControllerClass
属性似乎暂时不起作用

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

这是最近添加到master的:


截至本文撰写之时,还没有发布任何版本。它很可能是1.0.0.pre.3的一部分。

如果您只是在格式化之后,另一种可能是制作一个车把助手。例如,您可以实现自己的{{formatMoney item.balance}}助手

对于更一般的内容,我做了这个来包装一个
sprintf
实现(从其中选择一个):

Ember.handlebar.registerHelper('sprintf',函数(/*任意数量的参数*/){
var options=arguments[arguments.length-1],
fmtStr=参数[0],
params=Array.prototype.slice.call(参数,1,-1);
对于(变量i=0;i
然后您可以执行
{{sprintf“$%.2f”item.balance}

然而,@luke melia给出的解决方案将更加灵活——例如,允许您计算控制器中的平衡,而不是简单地格式化单个值

编辑:


我应该提出一个警告,因为这并不明显:上面的解决方案不会创建绑定的Handlebar辅助对象,因此不会反映对基础模型值的更改。应该有一个
registerBoundHelper
已经提交到了Ember.js,它可以解决这个问题,但是它也还没有发布。

太好了,我正在使用主版本。我试试看。我很高兴我的问题与整个问题的讨论方向一致:)
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);
});