Данные в ExtJS

Перевод статьи http://docs.sencha.com/ext-js/4-1/#!/guide/data

Для работы с данными в ExtJS определен 41 класс, но есть три, более важные чем остальные: Model, Store, Ext.Data.proxy.Proxy. Они используютсфя практически во всех приложениях.

Data package overview

Model и Store

Ext.data.Model представляет собой определенный тип данных в приложениях: например в приложения для электронной коммерции могут быть определены модели пользователей, продуктов, заказов и т.п.

Model architecture

Так можно создать Model:

Ext.define('User', {
    extend: 'Ext.data.Model',
    fields: [
        { name: 'id', type: 'int' },
        { name: 'name', type: 'string' }
    ]
});

Model как правило используется совместно со Store, который содержит коллекцию экземпляров Модели. Настройка Store для загрузки своих данных проста:

Ext.create('Ext.data.Store', {
    model: 'User',
    proxy: {
        type: 'ajax',
        url : 'users.json',
        reader: 'json'
    },
    autoLoad: true
});

Мы настроили наш Store, чтобы использовать прокси Ajax, указав через URL, адрес для загрузки данных. В нашем случае наш сервер возвращает JSON, поэтому мы создали Json reader и прочитали ответ. Store автоматически загружает набор пользовательских экземпляров модели из URL users.json, который должен возвращать строку  в JSON, выглядит которая примерно так:

{
    success: true,
    users: [
        { id: 1, name: 'Ed' },
        { id: 2, name: 'Tommy' }
    ]
}

Store также можно заполнить вручную:

Ext.create('Ext.data.Store', {
    model: 'User',
    data: [
        { firstName: 'Ed',    lastName: 'Spencer' },
        { firstName: 'Tommy', lastName: 'Maintz' },
        { firstName: 'Aaron', lastName: 'Conran' },
        { firstName: 'Jamie', lastName: 'Avins' }
    ]
});

 Сортировка и группировка

Store могут выполнить сортировку, фильтрацию и группировку локально, и также поддерживают удаленную сортировку, фильтрацию и группировку:

Ext.create('Ext.data.Store', {
    model: 'User',

    sorters: ['name', 'id'],
    filters: {
        property: 'name',
        value   : 'Ed'
    },
    groupField: 'age',
    groupDir: 'DESC'
});

В Store, который мы только что создали, данные будут отсортированы сначала по имени, потом по ID. Он будет фильтроваться, отобразятся только пользователи с именем «Ed»  и данные будут сгруппированы по возрасту в порядке убывания. Легко изменить порядок сортировки, фильтрации и группировки в любое время через Store API.

Прокси

Прокси используются в Store для обработки загрузки и сохранения данных модели . Есть два типа прокси: клиент и сервер. Примеры включают клиентские прокси для хранения в памяти  браузера и в Local Storage, который использует функции HTML 5 при их поддрежке браузером. Сервер прокси предназначен для маршалинга данных на удаленные сервера и поддерживает Ajax, JSONP и Rest.

Прокси-серверы могут быть определены в модели следующим образом:

Ext.define('User', {
    extend: 'Ext.data.Model',
    fields: ['id', 'name', 'age', 'gender'],
    proxy: {
        type: 'rest',
        url : 'data/users',
        reader: {
            type: 'json',
            root: 'users'
        }
    }
});

// Uses the User Model's Proxy
Ext.create('Ext.data.Store', {
    model: 'User'
});

Это помогает нам по двум причинам. Во-первых, вполне вероятно, что каждому Store, который использует модель пользователя потребуется загрузить свои данные, так что мы можем избежать необходимости дублирования определения прокси  для каждого Store. Во-вторых, теперь мы можем загружать и сохранять модель данных без Store:

// Gives us a reference to the User class
var User = Ext.ModelMgr.getModel('User');

var ed = Ext.create('User', {
    name: 'Ed Spencer',
    age : 25
});

// We can save Ed directly without having to add him to a Store first because we
// configured a RestProxy this will automatically send a POST request to the url /users
ed.save({
    success: function(ed) {
        console.log("Saved Ed! His ID is "+ ed.getId());
    }
});

// Load User 1 and do something with it (performs a GET request to /users/1)
User.load(1, {
    success: function(user) {
        console.log("Loaded user 1: " + user.get('name'));
    }
});

 

Добавить комментарий

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