テンプレートからモデル(backbone.js)に実装した計算フィールドにアクセスしたいと思います。それを行うために常にヘルパーを定義する必要がありますか?
問題は、モデルをテンプレートに渡す方法に関係していると思います。this.model.toJSON()を渡すと、プロパティにはアクセスできますが、定義した関数にはアクセスできません。this.modelを直接渡すと、関数にはアクセスできますが、バックボーンモデルのプロパティにはアクセスできません。
テンプレートからモデル(backbone.js)に実装した計算フィールドにアクセスしたいと思います。それを行うために常にヘルパーを定義する必要がありますか?
問題は、モデルをテンプレートに渡す方法に関係していると思います。this.model.toJSON()を渡すと、プロパティにはアクセスできますが、定義した関数にはアクセスできません。this.modelを直接渡すと、関数にはアクセスできますが、バックボーンモデルのプロパティにはアクセスできません。
常に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
できるようになりました。これは、ビューでアクセスできることを意味します。
あなたが言及したように、他のオプションは、ヘルパー メソッドを作成し、それらをハンドルバーに登録することです。テンプレートのレンダリング方法やテンプレートに渡されるデータに基づいて変更される機能がない限り、私はそれを気にしません。
ここに別の可能性があります: (モデルの初期化から)
initialize: function() {
this.on("change", function () {
this.set({ calculatedColumn: this.get("otherColumn") }, { silent: true });
});
},
これを行う最善の方法は、これをモデルに追加することです。
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 が必要になります。