2013-01-10 56 views
2

我正在循環訪問其內容設置爲RecordArray的ArrayController的內容。每個記錄是DS.Model,說客戶強制控制器始終作爲Ember中的模型的代理

{{# each item in controller}} 
{{item.balance}} 
{{/each}} 

平衡是客戶端模型的財產和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') 
}); 

這提供良好服務宗旨,爲balanceMoney計算財產權利的地方雖然是客戶端控制器而不是客戶端模型。我的印象是Ember在控制器中首先查找屬性,然後嘗試在模型中找到它們,如果沒有發現任何東西。儘管這裏沒有發生這種情況,但撥打item.balanceMoney的電話將被忽略,並且永遠不會到達控制器。

是否有可能以某種方式配置控制器,使其在任何情況下始終作爲模型的代理。

更新 - 使用emberjs主庫中的最新版本,您可以通過重寫ArrayController中的lookupItemController方法來配置數組控制器,以通過控制器代理解析記錄的方法。該方法應該返回控制器的名稱,而不用'controller'後綴,即客戶端而不是clientController。僅僅在數組控制器中設置itemControllerClass屬性目前似乎不起作用。

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

回答

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}}

然而,該解決方案@盧克 - 苦了會更靈活 - 比如讓你計算平衡控制器,而不是簡單地格式化單個值。

編輯:

一個警告我應該提到,因爲它不是很明顯:上述方案不會創建勢必車把幫手,讓底層模型值變化不會反映。應該有一個registerBoundHelper已經提交給Ember.js,它可以解決這個問題,但這個問題也沒有公佈。

相關問題