2011-09-13 19 views
11

Backbone.jsを使用attributes internal hashを直接変更するのではなく、setメソッドを使用してモデルのプロパティを設定することを強くお勧めします。backbone.jsモデルの内部属性ハッシュを直接設定する

しかし、 "change"イベントが自動的に発生しないこと以外は、内部ハッシュを直接変更する際に、他にどのような短所や "副作用"がありますか?

私が直面している問題は、setメソッドがオブジェクトリテラルを取りますが、実行時に決定された変数を使用して左辺を割り当てる必要があるということです。ありがとう。あなたはannotated source codeを見れば

myModel.set({ 
    myProperty : myValue; //myProperty is a variable, so this is invalid syntax 
}) 

//vs 

myModel.attributes[myProperty] = myValue; //myProperty is a variable that can be evaluated 

答えて

15

さて、あなたはsetは多くのことをしていることでしょう。その後

Backbone.Model.prototype.setByName = function(key, value, options) { 
    var setter = {}; 
    setter[key] = value; 
    this.set(setter, options); 
}; 

、あなたはちょうどあなたがモデル上で直接やりたいことができます:あなたはあなたのためにそれを行う機能でBackbone.Modelを延長した場合にどのような

var model = new Backbone.Model(); 
model.setByName(myProperty, "bar"); 

感じています私にとってはより良い解決策のようです。

編集

earl3sが指摘@として、これはバックボーンの最近のバージョンではもはや必要ではありません。今日、あなたはmodel.set(myProperty, "bar")と呼ぶことができ、それはあなたが望むことをします。

+1

あなたのソリューションは素晴らしいと思います。この機能は、新しいBackboneリリースに統合する必要があります。注釈付きソースコードを指摘してくれてありがとう。あなたが正しいです、私は最初にそれを見ていたはずです。 – fortuneRice

+0

nice!私はこのコードを12回書いたことがあり、それを方法にすることは考えていませんでした。 :) btw:これのために_.endendを使う必要はありません。 'Backbone.Model.prototype.setByName = function(...){...}'は同じことを...機能的に同じです。それを行うための別の方法です。 –

+0

@Derick Bailey:おかしい...私は '_.extend'がプロトタイプを拡張するために余分な賢さを持っていると思っていました。実際には、変更のコレクションを持つオブジェクトを拡張することです。何もそこに狂っていない。私の答えを変えてそれを認めてください。ありがとう。 –

7

Brian Genisioが言及しているannotated source codeでは、次の行を読むことができます: "key"、valueおよび{key:value}スタイルの引数を "両方処理する"。 したがって、model.set(myProperty、 "bar"、options)を使うことができます。 おそらく彼らはブライアンGenisioのポストの後にこの機能を追加しました..私は知らない。

+0

これは正しい解決策です。機能は 'set'メソッド上にすでに存在しています。 – earl3s

関連する問題