1. ホーム
  2. javascript

[解決済み] Backbone.jsのネストされたオブジェクト属性の取得と設定

2022-11-07 05:26:03

質問

Backbone.jsについて簡単な質問があります。 を得る セット という関数があります。

1) 下記のコードで、obj1.myAttribute1を直接「取得」または「設定」するにはどうしたらよいですか?

もう一つの質問です。

2) モデルでは のデフォルト オブジェクトは別として、モデルの他の属性は、Backboneのgetとsetメソッドでアクセスできるように、どこで宣言できますか/すべきですか?

var MyModel = Backbone.Model.extend({
    defaults: {
        obj1 : {
            "myAttribute1" : false,
            "myAttribute2" : true,
        }
    }
})

var MyView = Backbone.View.extend({
    myFunc: function(){
        console.log(this.model.get("obj1"));
        //returns the obj1 object
        //but how do I get obj1.myAttribute1 directly so that it returns false?
    }
});

できることは分かっている。

this.model.get("obj1").myAttribute1;

が、それは良い習慣なのでしょうか?

どのように解決するのですか?

一方 this.model.get("obj1").myAttribute1 は良いのですが、少し問題があります。なぜなら、同じようなことを set に対して行いたくなるかもしれないからです。

this.model.get("obj1").myAttribute1 = true;

しかし、このようにすると、Backboneのモデルの利点である myAttribute1 のための、変更イベントや検証のようなBackboneモデルの利点を得ることができません。

よりよい解決策は、モデルの中でPOJSO ("plain old JavaScript objects")を決してネストせず、代わりにカスタムモデルクラスをネストすることでしょう。ですから、次のようになります。

var Obj = Backbone.Model.extend({
    defaults: {
        myAttribute1: false,
        myAttribute2: true
    }
});

var MyModel = Backbone.Model.extend({
    initialize: function () {
        this.set("obj1", new Obj());
    }
});

とすると、アクセスコードは次のようになります。

var x = this.model.get("obj1").get("myAttribute1");

となりますが、より重要なのは、設定コードが

this.model.get("obj1").set({ myAttribute1: true });

で、適切な変更イベントなどを発生させます。動作例はこちら。 http://jsfiddle.net/g3U7j/