Работа с данными в ExtJS 4

Создание моделей

Для более удобной работы с данными в ExtJS 4 имеется класс Ext.data.Model, который представляет отдельную сущность в приложении или объект, обладающий определенными свойствами. Для хранения наборов подобных объектов используются хранилища данных. Итак, код нашего примера будет следующим:

Ext.onReady(function(){

	Ext.define('Person', {
		extend: 'Ext.data.Model',
		fields: [{
			name: 'Name',
			type: 'string'
		}, {
			name: 'Surname',
			type: 'string'
		}, {
			name: 'BirthDate',
			type: 'date',
			dateFormat: 'd-m-Y'
		}, {
			name: 'Salary',
			type: 'int'
		}, {
			name: 'Married',
			type: 'boolean'
		}]
	});

	var person = Ext.create('Person', {
		Name: 'Eugene',
		Surname: 'Popov',
		BirthDate: '22-05-1984',
		Salary: 300,
		Married: false
	});

	Ext.create('Ext.Panel', {
		title: 'Person: ' +person.get('Name')+ ' ' +person.get('Surname'),
		html: '<p>Имя: '+person.get('Name')+'</p>' +
		'<p>Фамилия: '+person.get('Surname')+'</p>' +
		'<p>Дата рождения: '+person.get('BirthDate')+'</p>' +
		'<p>Женат: '+(person.get('Married')==true?'да':'нет')+'</p>',
		width: 200,
		height: 200,
		renderTo: Ext.getBody(),
		style: 'margin-left: 30px;margin-top: 10px;'
	});
});

Теперь разберем его по порядку. Прежде всего нам необходимо создать класс модели. Этот класс в принципе идентичен обычному классу Ext JS. И с помощью метода Ext.define('Person', { extend: 'Ext.data.Model'.... мы расширяем функциональность класса Ext.data.Model, образуя новый класс Person. Определение полей новой модели находится в параметре fields. Этот параметр принимает массив объектов типа Ext.data.Field. С помощью свойства type определяется тип свойства, а с помощью свойства name - его имя.

Обратите внимание, что при указании свойства с типом date определяется формат даты, так как он в последствии используется методом Ext.Date.parse для надлежащего парсинга даты, особенно в тех случаях, когда она указана в нестандартных форматах.

Далее мы создаем объект данной модели с помощью метода create, заполняя его объектом javascript, который содержит набор пар ключ-значение, где в качестве ключа выступает имя свойства модели:

var person = Ext.create('Person', {
		Name: 'Eugene',
		Surname: 'Popov',
		BirthDate: '22-05-1984',
		Salary: 300,
		Married: false
	});

И уже при выводе значения данной модели на панель мы используем метод get у определенного нами объекта. Передавая в качестве параметра имя свойства, мы можем получить его значение (person.get('Name'))

Подобным образом мы можем динамически изменить значение свойства объекта с помощью метода set: person.set('Name', 'Alexander'); или person.set('Married', true);

Предобработка модели

Иногда возникает необходимость перед загрузкой обработать выводимые данные. Для этого в качестве параметра у поля модели мы можем определить параметр convert. Этот параметр принимает функцию, возвращающую значение данного свойства модели. Так, выше у нас в качестве дохода (свойство Salary) выводилось простое число. Теперь изменим это свойство:

...........................
		{
			name: 'Salary',
			type: 'int',
			convert: function(v, record){
						return record.get('Name') + ' получает ' + v + ' рублей';
					}
		}, 
.........................

Функция, передаваемая в параметр convert, принимает два аргумента: v - передаваемое значение, record - текущий объект модели. Метод record.get('Name') получает имя объекта и затем выполняется конкатенация строк. В итоге мы получим при выводе строку "Eugene получает 300 рублей".

Модели и формы

В предыдущем примере мы использовали метод get для получения данных и вывода их на панель. Однако если мы работаем с формами, то нам необязательно получать значение каждого свойства таким же образом. Мы просто можем связать форму с моделью:

Ext.onReady(function(){
    Ext.define('Person', {
        extend: 'Ext.data.Model',
        fields: [{
            name: 'Name',
            type: 'string'
        }, {
            name: 'Surname',
            type: 'string'
        }, {
            name: 'BirthDate',
            type: 'date',
            dateFormat: 'd-m-Y'
        }, {
            name: 'Salary',
            type: 'int'
        }, {
            name: 'Married',
            type: 'boolean'
        }]
    });

    var person = Ext.create('Person', {
        Name: 'Eugene',
        Surname: 'Popov',
        BirthDate: '22-05-1984',
        Salary: 300,
        Married: false
    });

    var formPanel=Ext.create('Ext.form.Panel',{
        title: 'Данные',
        width: 300,
        height:280,
		bodyPadding: 10,
        layout: 'anchor',
    defaults: {
        anchor: '90%'
    },
        renderTo: Ext.getBody(),
        items:[{
                xtype: 'textfield',
                fieldLabel: 'Имя',
                name: 'Name',
                labelAlign: 'top',
                flex: 1
               }, {
                xtype: 'textfield',
                fieldLabel: 'Фамилия',
                name: 'Surname',
                labelAlign: 'top',
                flex: 1
              },{
                xtype: 'datefield',
                fieldLabel: 'Дата рождения',
                name: 'BirthDate',
				},{
                xtype: 'numberfield',
                fieldLabel: 'Доход',
                name: 'Salary',
				},{
                xtype: 'checkbox',
                boxLabel: 'Женат(Замужем)',
                name: 'Married',
                checked:'true',
                }],
        buttons: [{
            text: 'Сброс',
            handler: function() {
                formPanel.getForm().loadRecord(person);
            }
        }]
    });
});

После нажатия на кнопку сброс у нас в поля формы будут загружены данные объекта модели person благодаря использованию метода formPanel.getForm().loadRecord(person), который в качестве параметра принимает объект загружаемой модели.

    Поддержать сайт на родительском проекте КГБ