У меня простой вопрос о функциях получения и установки Backbone.js .
1) Как с помощью приведенного ниже кода я могу напрямую «получить» или «установить» obj1.myAttribute1?
Другой вопрос:
2) В модели, помимо объекта по умолчанию , где я могу / должен объявить другие атрибуты моей модели, чтобы к ним можно было получить доступ через методы get и set Backbone?
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;
но это хорошая практика?
javascript
backbone.js
backbone-model
удачаРис
источник
источник
defaults
(obj1 в данном случае), этот же объект будет использоваться всеми экземплярами модели. Текущая практика состоит в том, чтобы определитьdefaults
как функцию, которая возвращает объект, который будет использоваться по умолчанию. backbonejs.org/#Model-defaults (см. примечание, выделенное курсивом)Ответы:
Хотя
this.model.get("obj1").myAttribute1
это нормально, это немного проблематично, потому что тогда у вас может возникнуть соблазн сделать то же самое для набора, т. Е.Но если вы сделаете это, вы не получите преимуществ моделей Backbone для
myAttribute1
, например, для событий изменения или проверки.Лучшим решением было бы никогда не вкладывать POJSO («простые старые объекты JavaScript») в свои модели, а вместо этого вкладывать пользовательские классы модели. Это будет выглядеть примерно так:
Тогда код доступа будет
но что более важно, код настройки будет
который будет запускать соответствующие события изменения и тому подобное. Рабочий пример здесь: http://jsfiddle.net/g3U7j/
источник
Uncaught TypeError: Object #<Object> has no method 'set'
Backbone.Model
, а затем начинают волшебное всплытие событий.Я создал для этого модель backbone-deep - просто расширите Backbone.DeepModel вместо Backbone.Model, и затем вы сможете использовать пути для получения / установки атрибутов вложенной модели. Он также поддерживает события изменений.
источник
//You can use index notation to fetch from arrays console.log(model.get('otherSpies.0.name')) //'Lana'
Решение Доменика будет работать, однако каждая новая модель MyModel будет указывать на один и тот же экземпляр Obj. Чтобы этого избежать, MyModel должна выглядеть так:
См. Ответ c3rin @ https://stackoverflow.com/a/6364480/1072653 для полного объяснения.
источник
Я использую такой подход.
Если у вас есть такая модель Backbone:
Вы можете установить атрибут «ab» с помощью:
Теперь ваша модель будет иметь такие атрибуты, как:
с запущенным событием "изменение".
источник
meta2= m.get('x'); meta2.id=110; m.set('x', meta2)
. Для меня это не вызывает никаких изменений :(_.clone(m.get('x'))
. спасибоsetting
с объектом, которым вы являетесьgetting
в заданное время. Таким образом, если вы не клонируете два объекта, тогда два сравниваемых объекта будут точно такими же в установленное время.Есть одно решение, о котором еще никто не придумал, и которое можно использовать в большом количестве. Вы действительно не можете напрямую устанавливать вложенные атрибуты, если не используете стороннюю библиотеку, которая вам, вероятно, не нужна. Однако вы можете сделать клон исходного словаря, установить там вложенное свойство и затем установить весь словарь. Кусок пирога.
источник
У меня была та же проблема, что и у @pagewil и @Benno с решением @Domenic. Вместо этого я решил написать простой подкласс Backbone.Model, который решает проблему.
NestedModel позволяет им работать (что происходит, когда myModel устанавливается через данные JSON):
Было бы легко сгенерировать список моделей автоматически при инициализации, но этого решения мне было достаточно.
источник
Решение, предложенное Домеником, имеет ряд недостатков. Допустим, вы хотите прослушать событие «изменение». В этом случае метод инициализации не будет запущен, а ваше настраиваемое значение атрибута будет заменено объектом json с сервера. В своем проекте я столкнулся с этой проблемой. Мое решение переопределить метод набора модели:
источник
Хотя в некоторых случаях использование моделей Backbone вместо атрибутов вложенных объектов имеет смысл, как упоминал Доменик, в более простых случаях вы можете создать функцию установки в модели:
источник
Если вы взаимодействуете с серверной частью, для чего требуется объект со структурой вложенности. А вот с позвоночником проще работать с линейной структурой.
backbone.linear может вам помочь.
источник