2

コンテンツがRecordArrayに設定されているArrayControllerのコンテンツをループしています。各レコードはDS.Modelであり、クライアントと言います

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

balanceはクライアントモデルのプロパティであり、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」サフィックスのないコントローラーの名前、つまりclientControllerではなくclientを返す必要があります。アレイコントローラでプロパティを設定するだけ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

フォーマットした後だけの場合、別の可能性はハンドルバーヘルパーを作成することです。たとえば、独自の{{formatMoneyitem.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が提供するソリューションは、はるかに柔軟です。たとえば、単一の値を単純にフォーマットするのではなく、コントローラーでバランスを計算できるようにします。

編集:

明らかではないため、注意が必要です。上記のソリューションでは、バインドされたハンドルバーヘルパーが作成されないため、基になるモデル値への変更は反映されません。これを修正するEmber.jsにすでにコミットされているはずregisterBoundHelperですが、それもまだリリースされていません。

于 2013-01-10T12:26:10.243 に答える