Работа с хранилищем в ExtJS

В прошлом параграфе мы получали данные, обращаясь через прокси модели к определенному веб-ресурсу. Одним из простых методов загрузки данных в модель представляет использование объекта Ext.data.Store:

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

 var myStore = Ext.create('Ext.data.Store', {
     model: 'User'
 });

Хранилище предназначено для хранения объектов модели. А тип модели указывается в свойстве model. В данном случае это ранее созданная модель User.

Также мы можем создать свое собственное хранилище, унаследовав его от Ext.data.Store:

Ext.define('User', {
     extend: 'Ext.data.Model',
     fields: [
         {name: 'id',  type: 'int'},
		 {name: 'name', type: 'string'}
     ]
 });
Ext.define('UserStore', {
     extend: 'Ext.data.Store',
     model: 'User'
 });
 var myStore = Ext.create('UserStore');

Добавление данных в хранилище

Добавление данных производится с помощью метода add:

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

 var myStore = Ext.create('Ext.data.Store', {
     model: 'User'
 });
 var user = Ext.create('User', {
     id: 1, name: 'Eugene'
 });
 myStore.add(user);
 alert(myStore.count());

Если вдруг нам надо добавить объект на определенное место в хранилище, то мы используем метод insert:

var user = Ext.create('User', {
     id: 1, name: 'Eugene'
 });
 myStore.insert(0,user);

Удаление данных из хранилища

Удаление данных из хранилища производится методом remove и его модификациями:

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

 var myStore = Ext.create('Ext.data.Store', {
     model: 'User'
 });
 var user1 = Ext.create('User', {
     id: 1, name: 'Eugene'
 });
  myStore.add(user1);
 var user2 = Ext.create('User', {
     id: 2, name: 'Ivan'
 });
 myStore.add(user2);
 myStore.remove(user1); // удаление определенной модели
 myStore.removeAt(0); // удаление по индексу
 myStore.removeAll(); // удаление всех объектов из хранилища

Получение данных из хранилища

Получить объекты мы можем по индексу с помощью метода getAt, а также мы можем с помощью специальных методов извлечь первый и последний элементы:

 var userFromStore = myStore.getAt(0); //получение по индексу в хранилище
 alert(userFromStore.get('name'));

 var i=3;
 // проверка на наличие элемента по индексу
 if(i<myStore.count())
 {
	userFromStore = myStore.getAt(i);
	alert(userFromStore.get('name'));
 }

 var first = myStore.first(); //получение первого объекта
 var last = myStore.last(); // получение последнего объекта
 alert(first.get('name'));
 alert(last.get('name'));

Проверку на количество объектов в хранилище мы можем сделать с помощью метода count, которое возвращает кол-во объектов.

Также мы можем получить целый диапазон объектов с помощью метода getRange:

var i=0;
  var j=1
 if(i<myStore.count() && j<myStore.count())
 {
	var users = myStore.getRange(i,j);
	Ext.each(users, function(record,index){
		alert((index+1)+'. '+record.get('name'));
	});
 }

Также мы просто можем перебрать все объекты хранилища:

myStore.each(function(record,index){
		alert((index+1)+'. '+record.get('name'));
	});

Загрузка данных с сервера

Ext.onReady(function(){      
      Ext.define('User', {
		extend: 'Ext.data.Model',
		fields: [
			{name: 'id',  type: 'int'},
			{name: 'name', type: 'string'}
		]
	});
	 Ext.define('UserStore', {
		extend: 'Ext.data.Store',
		model: 'User',
		proxy: {
			type: 'ajax',
			url: 'users.json'
		},
		autoLoad: true
	});
	var myStore = Ext.create('UserStore');
	myStore.load(function() {
		myStore.each(function(record){
			alert(record.get('name'));
		});
	});
});

В данном случае у нас простая модель - User и для загрузки данных в модель используется хранилище myStore. Чтобы ассоциировать хранилище с определенной моделью, мы указываем эту модель в параметре model. Далее опция proxy позволяет задать параметры загрузки, указав в свойстве url адрес, по которому будут загружаться данные.

Важную роль играет установка ридера (параметр reader), где мы говорим, что чтение загруженных данных будет производиться в формате json, а в качестве корневого узла будет выбран узел users (reader: {type: 'json', root: 'users'}). Далее мы посмотрим, что можно создать ридер также для данных в формате xml.

Файл users.json, находящийся на сервере, мог бы быть таким:

[
	{
		"id": 1,
		"name": "Eugene"
	},{
		"id": 2,
		"name": "Ivan"
	}
]

Указанный у хранилища параметр autoLoad: true говорит о том, что загрузка данных с веб-ресурса будет происходить автоматически при загрузке страницы. Но мы также можем загрузить данные динамически, использовав метод load:

myStore.load(function() {
		myStore.each(function(record){
			alert(record.get('name'));
		});
	});

Метод load принимает функцию, которая выполняется после выполнения запроса к ресурсу.

Группировка данных

Хранилище позволяет нам упорядочить данные по определенному типу:

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

 var myStore = Ext.create('Ext.data.Store', {
     model: 'User',
	 groupers: [{
            property: 'name'
        }]
 });
 var user1 = Ext.create('User', {
     id: 1, name: 'Sasha'
 });
  myStore.add(user1);
 var user2 = Ext.create('User', {
     id: 2, name: 'Ivan'
 });
 myStore.add(user2);

  myStore.each(function(record,index){
		alert((index+1)+'. '+record.get('name'));
	});
});

В данном случае в определении хранилища мы добавили параметр groupers. В этот параметр определили элемент группировки по свойству name. Поэтому в данном случае первым будет выведен второй добавленный элемент, а не первый.

Альтернативой определения группировки в хранилище служит использование метода group:

var myStore = Ext.create('Ext.data.Store', {
     model: 'User'
 });
 //..........................................
 myStore.group('name');

Специальные методы хранилища

Объекты хранилища также содержат пять специальных методов, выполняющих различные функции:

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