Связь нескольких моделей

Ext JS 4 предоставляет возможность связать или ассоциировать несколько моделей друг с другом. Например, одна книга может иметь двух авторов, реализуя связь один-ко-многим (one-to-many).

Фреймворк Ext JS 4 три подобных отношения или типа связей:

Рассмотрим эти взаимосвязи. Допустим, у нас есть модель Company, представляющая компанию, у которой может быть несколько основателей. К примеру, компания Microsoft, которую основали Билл Гейтс и Полл Аллен. Теперь добавим соответствующие модели Company и Manager и соединим их связью один ко многим (one-to-many):

Ext.onReady(function(){
    Ext.define('Company', {
        extend: 'Ext.data.Model',
        fields: [{
        name: 'Title',
        type: 'string'
        },{
        name: 'Date',
        type: 'date',
        dateFormat: 'd-m-Y'
        }, {
        name: 'Value',
        type: 'int'
        }],
        associations: [{
        type: 'hasMany',
        model: 'Manager',
        name: 'founders'
        }]
    });

    Ext.define('Manager', {
        extend: 'Ext.data.Model',
        fields: [{
        name: 'FirstName',
        type: 'string'
        }, {
        name: 'LastName',
        type: 'string'
        }]
    });
    var company = Ext.create('Company', {
        Title: 'Microsoft',
        Date: '01-01-1974',
        Value: 30000
    });
    company.founders().add({
				FirstName: 'Bill',
				LastName: 'Gates'
				}, {
				FirstName: 'Paul',
				LastName: 'Allen'
			});
	company.founders().each(function (founder){
		alert(founder.get('FirstName') + " "+founder.get('LastName'));
	});
});

Теперь разберем код. Вначале мы создаем две модели Company и Manager и добавляем к ним определения полей. В отличии от тех определений моделей, с которыми мы имели дело в прошлых параграфах, в данном случае в модель company добавляется определение ассоциации с другими моделями:

associations: [{
		type: 'hasMany',
		model: 'Manager',
		name: 'founders'
		}]

В данном случае, так как мы используем связь один-ко-многим, то используем конфигурацию объекта Ext.data.HasManyAssociation. Для этого указывается параметр type со значением hasMany. Кроме того, данный параметр в зависимости от выбранного типа ассоциации может принимать значения hasOne и belongsTo.

Параметр model принимает название модели, с которой ассоциируется текущая модель.

Параметр name принимает имя функции, которая создает дочернее хранилище. Таким образом, в данном случае при вызове функция founders будет возвращать хранилище, которое будет содержать связанные с текущим объектом модели Company данные.

Затем у хранилища, создаваемого функцией company.founders(), мы можем вызвать метод add, который добавляет новые объекты типа Manager к текущему объекту Company.

Ассоциация многие к одному

Данный тип ассоциации действует подобным образом:

Ext.onReady(function(){

	Ext.define('Company', {
		extend: 'Ext.data.Model',
		fields: [{
		name: 'Title',
		type: 'string'
		},{
		name: 'Date',
		type: 'date',
		dateFormat: 'd-m-Y'
		}, {
		name: 'Value',
		type: 'int'
		}]
	});

	Ext.define('Manager', {
		extend: 'Ext.data.Model',
		fields: [{
		name: 'FirstName',
		type: 'string'
		}, {
		name: 'LastName',
		type: 'string'
		}],
		belongsTo: 'Company'
	});
	var manager = Ext.create('Manager', {
		FirstName: 'Bill',
		LastName: 'Gates'
	});
	 var company = Ext.create('Company', {
        Title: 'Microsoft',
        Date: '01-01-1974',
        Value: 30000
    });
	manager.setCompany(company);
	manager.getCompany(function(company, operation){
		alert(company.get('Title'));
	});
});

Данный тип связи похож на предыдущую, только в модели Manager мы указываем ассоциацию с моделью Company (belongsTo: 'Company'). Для управления ассоциированной связью у модели определяются методы get и set, которые в качестве суффикса имеют название связанной модели. Так, в данном случае это методы getCompany и setCompany, поскольку у нас связь идет к модели Company.

В итоге ассоциированные данные загружаются после вызова метода manager.setCompany. А получить мы их можем с помощью метода manager.getCompany.

Ассоциация один к одному

Последний тип ассоциации - один к одному:

Ext.onReady(function(){
	Ext.define('Company', {
		extend: 'Ext.data.Model',
		fields: [{
		name: 'Title',
		type: 'string'
		},{
		name: 'Date',
		type: 'date',
		dateFormat: 'd-m-Y'
		}, {
		name: 'Value',
		type: 'int'
		}],
		associations: [{
			type: 'hasOne',
			model: 'Manager',
			name: 'manager'
		}]
	});

	Ext.define('Manager', {
		extend: 'Ext.data.Model',
		fields: [{
		name: 'FirstName',
		type: 'string'
		}, {
		name: 'LastName',
		type: 'string'
		}]
	});
	var manager = Ext.create('Manager', {
		FirstName: 'Bill',
		LastName: 'Gates'
	});
	 var company = Ext.create('Company', {
        Title: 'Microsoft',
        Date: '01-01-1974',
        Value: 30000
    });
	company.setManager(manager);
	company.getManager(function(manager, operation){
		alert(manager.get('LastName'));
	});
});

Сам код ассоциации, как и в случае с первой ассоциацией, включается в блоке

associations: [{
            type: 'hasOne',
            model: 'Manager',
            name: 'manager'
        }]

Также, как и в случае с предыдущей ассоциацией, используя метод setManager, мы устанавливаем для определенной компании менеджера. А используя метод getManager, мы получаем связанный с текущим объектом Company объект Manager.

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