Сеттер в Javascript + BackBone это правильный путь? - PullRequest
0 голосов
/ 11 января 2012

У меня есть этот "объект"

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

Есть ли другой способ?Я не могу ходить, думая, что оригинальный путь слишком уродлив, чтобы его использовать.

Ответы [ 2 ]

3 голосов
/ 11 января 2012

Для ясности я меняю имя аргумента на newName. В то время как:

this.set({name: newName});

означает: установить значение атрибута с именем name с новым значением newName параметр (правильный), эта форма:

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

ничего не делает. Он получает атрибут, имя которого указано в параметре newName, и возвращает его. Назначение не имеет никакого эффекта.

С другой стороны это:

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

, вероятно, выдаст ошибку. this - объект модели Backbone. Он содержит свойство 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 правильно.

1 голос
/ 11 января 2012

Оригинальный способ выглядит лучше всего для меня. Вы ДОЛЖНЫ вызвать set () в модели, чтобы система событий Backbone работала правильно. Ваши два примера не имеют большого смысла (то есть присвоение значения значению и вызов set () для значения вместо модели).

Я на самом деле думаю, что добавление вашего собственного метода setName довольно странно. Любой, кто программирует Backbone.js, должен знать, как использовать встроенную функцию set () в экземплярах модели для установки значений свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...