Связь нескольких моделей
Ext JS 4 предоставляет возможность связать или ассоциировать несколько моделей друг с другом. Например, одна книга может иметь двух авторов, реализуя связь один-ко-многим (one-to-many).
Фреймворк Ext JS 4 три подобных отношения или типа связей:
Один ко многим (One-to-many) (тип Ext.data.HasManyAssociation)
Многие к одному (Many-to-one) (тип Ext.data.BelongsToAssociation)
Один к одному (Has-one) (тип Ext.data.association.HasOne)
Рассмотрим эти взаимосвязи. Допустим, у нас есть модель 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.