[javascript] Backbone.js erhält und setzt verschachtelte Objektattribute


Answers

Ich habe ein backbone-deep-model dafür erstellt - erweitern Sie einfach Backbone.DeepModel statt Backbone.Model und Sie können dann Pfade verwenden, um verschachtelte Modellattribute zu erhalten / setzen. Es verwaltet auch Änderungsereignisse.

model.bind('change:user.name.first', function(){...});
model.set({'user.name.first': 'Eric'});
model.get('user.name.first'); //Eric
Question

Ich habe eine einfache Frage zu den Funktionen zum Abrufen und Einstellen von Backbone.js.

1) Wie kann ich mit dem folgenden Code obj1.myAttribute1 direkt "bekommen" oder "setzen"?

Eine andere Frage:

2) Wo kann / soll ich im Modell neben den Standard- Objekten die anderen Attribute meines Modells angeben, so dass sie über die Methoden "Get" und "Set" von Backbone aufgerufen werden können?

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?
    }
});

Ich weiß, ich kann:

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

Aber ist das eine gute Praxis?




Ich benutze diesen Ansatz.

Wenn Sie ein Backbone-Modell wie folgt haben:

var nestedAttrModel = new Backbone.Model({
    a: {b: 1, c: 2}
});

Sie können das Attribut "ab" mit:

var _a = _.omit(nestedAttrModel.get('a')); // from underscore.js
_a.b = 3;
nestedAttrModel.set('a', _a);

Jetzt wird Ihr Modell folgende Attribute haben:

{a: {b: 3, c: 2}}

mit dem Ereignis "change" ausgelöst.




Während in einigen Fällen die Verwendung von Backbone-Modellen anstelle von geschachtelten Objektattributen sinnvoll ist, wie in Domenic erwähnt, könnten Sie in einfacheren Fällen eine Setter-Funktion im Modell erstellen:

var MyModel = Backbone.Model.extend({
    defaults: {
        obj1 : {
            "myAttribute1" : false,
            "myAttribute2" : true,
        }
    },
    setObj1Attribute: function(name, value) {
        var obj1 = this.get('obj1');
        obj1[name] = value;
        this.set('obj1', obj1);
    }
})



Die von Domenic vorgeschlagene Lösung hat einige Nachteile. Angenommen, Sie möchten das Ereignis "Ändern" hören. In diesem Fall wird die Methode 'initialize' nicht ausgelöst und Ihr benutzerdefinierter Wert für das Attribut wird durch das json-Objekt vom Server ersetzt. In meinem Projekt habe ich mich mit diesem Problem konfrontiert. Meine Lösung zum Überschreiben der 'set'-Methode von Model:

set: function(key, val, options) {
    if (typeof key === 'object') {
        var attrs = key;
        attrs.content = new module.BaseItem(attrs.content || {});
        attrs.children = new module.MenuItems(attrs.children || []);
    }

    return Backbone.Model.prototype.set.call(this, key, val, options);
}, 





Links