Модели в Backbone.js
Backbone.js

Модели в Backbone.js

Модели в Backbone.js содержат данные приложения, а также логику, связанную с этими данными: валидацию, вычисляемые поля и т.д. Модели создаются расширением Backbone.Model:


App.User = Backbone.Model.extend({
    initialize: function() {
        alert('Initialized');
    }
});
var testUser = new User();

Установка атрибутов

Созданный в предыдущем примере экземпляр модели не содержит каких-либо данных. Установить значения атрибутов можно как при инициализации экземпляра модели:


var testUser = new User({
    name: 'Frank'
});

так и с помощью сеттера:


var testUser = new User();
testUser.set({ name: 'Frank' });

Получение атрибутов

Внутри модели все данные хранятся в объекте attributes. Получить значение атрибута можно с помощью метода get().


var testUser = new User({ name: 'Frank' });
var name = testUser.get('name');

Получить все атрибуты модели можно с помощью метода toJSON():


var attributes = user.toJSON();

Также все экземпляры модели могут иметь некое состояние по умолчанию — это соответствие можно задать с помощью объекта defaults.


App.User = Backbone.Model.extend({
    defaults: {
        name: 'Unknown'
    }
});

События изменения состояния модели

На событие изменения любого атрибута модели может быть навешен обработчик:


initialize: function() {
    this.bind('change:name', function() {
        var name = this.get('name');
        alert(name);
    });
}

В примере выше мы повесили обработчик только на событие изменения атрибута name. Обработчик:


this.bind('change', function() {}); 

будет срабатывать при изменении любого атрибута модели.

На событие изменения модели можно повесить функцию render() представления:


var UserView = Backbone.View.extend({
    initialize: function() {
        this.model.bind('change', _.bind(this.render, this));
    }
});
Обратите внимание, мы использовали функцию _.bind (реализацию функции bind() из Underscore.js), чтобы явно указать, что значением this будет объект представления (подробнее о функции bind()).

Валидация модели

Backbone.js позволяет определить метод validate() у модели, чтобы проверить корректность данных.

По умолчанию, валидация происходит при вызове метода save() или когда метод set() вызван с опцией {validate: true}.


var user = new Backbone.Model({ name: 'Frank' });
User.validate = function(attributes) {
    if (!attributes.name) {
        return 'Name is required';
    }
};
User.set({ name: 'John' });
User.unset('name', { validate: true }); //false

Метод validate() всегда возвращает текст ошибки. Если все поля модели корректны — функция не должна ничего возвращать.

Если возвращается ошибка:

  • срабатывает событие invalid модели и устанавливается свойство validationError, в котором сохраняется текст ошибки;
  • метод save() не срабатывает и данные на сервере не изменяются.

Заключение

Немного более подробно, чем во введении в Backbone.js мы рассмотрели модели. В двух словах, модель — это какая-либо сущность предметной области, будь то пользователь, книга, продукт, элемент меню. Модели в Backbone.js позволяют хранить данные приложения, имеют методы для добавления, изменения и удаления этих данных (атрибуты модели).

Также модели предоставляют возможность реагировать на события изменения атрибутов модели как самим моделям, так и представлениям, коллекциям и т.д. с помощью событий. События рассмотрены очень кратко, т.к. мы поговорим о них более подробно в отдельной статье.

Рассылка
Подпишитесь на рассылку и получайте дайджест новостей и статей.
Никакого спама!
Подписаться