2012-01-11 3 views
0

私は、この "対象"Javascript + BackBoneのセッターはこれが正しいですか?

Person = Backbone.Model.extend({ 
    defaults: { 
     name: 'Fetus', 
     age: 0, 
     children: [] 
    }, 
    initialize: function() { 
     this.bind("change:name", function() { 
      var name = this.get("name"); 
      alert("Changed my name to " + name); 
     }); 
    }, 
    adopt: function(newChildsName) { 
     this.get("children").push(newChildsName); 
    }, 
    setName: function(name) { 
     this.set({ 
      name: name 
     }); 
    } 
}); 

は、setメソッドは次のように行われsetNameすることはできませんしまった: 私は試みたが、彼らは

setName: function(name){ 
    this.get(name) = name; 
} 

または

setName: function(name){ 
    this[name].set(name); 
} 
を動作しません。

別の方法がありますか?元のやり方が使いづらいのではないかと考えて回ることはできません。

+0

私が知る限り、それは標準的な方法です。より良い方法があれば、より経験豊富なバックボーンユーザーの回答をさせていただきます。 – c4urself

答えて

3

わかりやすくするために、引数名をnewNameに変更しています。

this.set({name: newName}); 

の意味:ながらnewNameパラメータ(正しい)の新しい値でnameという名前の属性の値を設定し、このフォーム:

setName: function(newName){ 
    this.get(newName) = newName; 
} 

は何もしません。名前がnewNameのパラメータで指定された属性を取得し、それを返します。この割り当ては無効です。一方

この:

setName: function(newName){ 
    this[newName].set(newName); 
} 

は、おそらくエラーがスローされます。 thisはバックボーンモデルオブジェクトです。それはそうだろう、attributesプロパティが含まれています

this.attributes[newName] = newName; 

は、より合理的である(名前はnewName値にnewNameパラメータで渡された属性を変更しかし、この場合にはchangeイベントがトリガされることはありません。しかし、私は推測してみましょう。 、これはあなたが本当に望んでいたものです:あなたが呼び出すことができます。この場合

setAttr: function(name, value){ 
    var diff = {}; 
    diff[name] = value; 
    this.set(diff); 
} 

model.setAttr('id', 7); 

model.setAttr({id: 7}); 

と一致し、change:idが正しくトリガーされます。

+0

これまでに:Dありがとう! –

1

オリジナルの方法は私に最もよく見えます。 Backboneのイベントシステムが正しく動作するためには、モデル上でset()を呼び出す必要があります。あなたの2つの例はあまり意味をなさない(つまり、値を値に代入し、モデルではなく値にset()を呼び出す)。実際には、独自のsetNameメソッドを追加するのは奇妙だと思う。 Backbone.jsは、モデルインスタンスに対して組み込みのset()関数を使用してプロパティ値を設定することを知っている必要があります。

関連する問題