13

テンプレートからモデル(backbone.js)に実装した計算フィールドにアクセスしたいと思います。それを行うために常にヘルパーを定義する必要がありますか?

問題は、モデルをテンプレートに渡す方法に関係していると思います。this.model.toJSON()を渡すと、プロパティにはアクセスできますが、定義した関数にはアクセスできません。this.modelを直接渡すと、関数にはアクセスできますが、バックボーンモデルのプロパティにはアクセスできません。

4

4 に答える 4

17

常にthis.model.toJSON()テンプレートに渡します。

計算値を取得するために必要なことはtoJSON、モデルのメソッドをオーバーライドすることです。


MyModel = Backbone.Model.extend({

  myValue: function(){
    return "this is a calculated value";
  },

  toJSON: function(){
    // get the standard json for the object
    var json = Backbone.Model.prototype.toJSON.apply(this, arguments);

    // get the calculated value
    json.myValue = this.myValue();

    // send it all back
    return json;
  }

})

myValueこれで、によって返された JSON から にアクセスtoJSONできるようになりました。これは、ビューでアクセスできることを意味します。

あなたが言及したように、他のオプションは、ヘルパー メソッドを作成し、それらをハンドルバーに登録することです。テンプレートのレンダリング方法やテンプレートに渡されるデータに基づいて変更される機能がない限り、私はそれを気にしません。

于 2012-05-18T13:22:48.957 に答える
4

ここに別の可能性があります: (モデルの初期化から)

initialize: function() {
        this.on("change", function () {
            this.set({ calculatedColumn: this.get("otherColumn") }, { silent: true });
        });
    },

バックボーンの計算されたプロパティ

于 2014-07-17T22:33:29.937 に答える
0
于 2013-11-21T15:54:17.030 に答える
-1

これを行う最善の方法は、これをモデルに追加することです。

function initialize() {
    this.set("calculatedColumn", function () { return this.otherColumn; });
}

バックボーン モデルは通常、実際のデータ値を「model.attributes」に内部的に保存します。そのため、モデルをテンプレートに直接渡すと、関数のみがモデルに直接追加され、データは含まれません。また、model.toJSON() を使用する場合、通常は _.clone(model.attributes) としてバックボーンに実装されます (backbone.js を参照)。したがって、モデルに直接追加された関数ではなく、データがあります。上記が機能するのはそのためです。モデル オブジェクト自体ではなく、model.attributes に関数を設定します。model.attributes を直接参照しないでください。model.get("calculatedColumn") と model.set("calculatedColumn", ...) を使用してください。

したがって、model.get("calculatedColumn") は関数を返します。ハンドルバーで {{calculatedColumn}} に移動すると (ハンドルバーを使用していると仮定して)、関数によって返された値が表示されます。ただし、backbone は同期して (backbone.js で) model.toJSON に JSON.stringify を実行し、JSON.stringify は関数を無視するため、calculatedColumn はサーバーに送信されません。JSON.stringify で関数を無視しないようにする場合 (ビューのレンダリングとモデルの同期中に toJSON がモデルで実行されるたびに関数がデータ値に変換されるようにするため)、@Derick Bailey が説明したように model.toJSON をオーバーライドします。

また、必要に応じて、Backbone.Model から独自の BaseModel を派生させ、.toJSON をオーバーライドして、BaseModel からすべてのモデルを派生させることができます。次に、任意のモデルに適用できる汎用バージョンの .toJSON が必要になります。

于 2014-07-17T22:15:11.440 に答える