Описание
Модели в ember-приложениях наследуются от класса Ember Data DS.Model.
models
и именуются следующим образом: если соответствующий C#-класс называется NewPlatform.Someproject.Somemodel
, то файл с моделью должен называться new-platform-someproject-somemodel
. Если на OData-бакенде используется атрибут PublishName
для упрощения именования моделей, то наименование пространства имен в этом случае в клиентской модели может отсутствовать (имя клиентской модели будет соответствующим образом формироваться из имени в EDM-модели на OData-бакенде)Модели чаще всего имеют следующую структуру:
// Импорты.
import DS from 'ember-data';
import { Projection } from 'ember-flexberry-data';
var Model = Projection.Model.extend({
// Собственные атрибуты, мастера, детейлы.
name: DS.attr('string'),
someMaster: DS.belongsTo('new-platform-someproject-somemaster', { inverse: 'somemodel', async: false, polymorphic: true }),
...
// Правила валидации.
validations: {
name: { presence: true }
...
}
});
// Определение модели-предка (при наличии).
Model.reopenClass({
_parentModelName: '...' // Указывается имя модели, от которой наследуется данная модель, например 'new-platform-someproject-parent'.
});
// Определение представлений.
Model.defineProjection(
name: Projection.attr(''),
someMaster: Projection.belongsTo('new-platform-someproject-somemaster', '', {
...
})
...
});
Model.defineProjection(
...
});
// Экспорт модели.
export default Model;
Импорты и экспорт соответствуют требованиям синтаксиса ember-cli.
Создаваемая модель наследуется от базового технологического класса, определенного в аддоне ember-flexberry-data
.
Для модели задаются представления.
Существуют также разные подходы к заданию значения по умолчанию для атрибутов модели.
Определение модели
Модели определяются “стандартным” для Ember способом.
Дополнительно в моделях, унаследованных от базовой технологической модели, используются правила валидации модели.
Для атрибутов любых моделей Ember доступны встроенные типы данных string
(строка), number
(число), boolean
(логический тип) и date
(дата). Для определения других типов данных в моделях Ember используются трансформации.
Дополнительно к стандартным типам данных в аддоне ember-flexberry-data
были добавлены трансформации decimal
(вещественный тип), file
(тип “Файл”), flexberry-enum
(тип для перечислений), guid
(тип “GUID”, который используется по умолчанию для первичных ключей).
Подробнее об использовании трансформаций для перечислений можно посмотреть тут.
Пример модели для класса с мастером employee1
типа ‘new-platform-someproject-employee’ и детейлами orders
типа ‘new-platform-someproject-order’.
var Model = BaseModel.extend({
firstName: DS.attr('string'),
lastName: DS.attr('string'),
birthDate: DS.attr('date'),
photo: DS.attr('file'),
gender: DS.attr('new-platform-someproject-gender'),
employee1: DS.belongsTo('new-platform-someproject-employee', { inverse: null, async: false }),
orders: DS.hasMany('new-platform-someproject-order', { inverse: 'employee', async: false }),
});
Первичные ключи в модели
Первичные ключи объекта не задаются в модели явно.
В клиентском коде обращения к первичному ключу можно выполнить через свойство id
.
Как называется соответствующее свойство на сервере, определяется в сериализаторе.
Тип первичного ключа
Первичные ключи моделей в Ember
-приложениях всегда являются строками, но на сервере это поведение можно изменить.
При изменении типа первичного ключа на сервере необходимо переопределить статическое свойство idType
в классе модели:
import { Projection } from 'ember-flexberry-data';
let Model = Projection.Model.extend({
// ...
});
Model.reopenClass({
idType: '...',
});
export default Model;
Устанавливается свойство idType
при помощи статической функции defineIdType
в базовой технологической модели:
defineIdType: function (newIdType) {
this.reopenClass({
idType: newIdType,
});
},
Вызвать этот метод можно следующим образом:
Model.defineIdType('string');
Тип первичного ключа - это метаданные модели, поэтому свойство idType
определено именно в модели, а не, например, в адаптере.
Получить тип ключа можно через метод getMeta
утилиты information
из аддона ember-flexberry-data
.
В языке запросов тип ключа учитывается автоматически, и при построении запросов к OData-бакенду значения ключей в URL запросов “окавычиваются” только в том случае, если тип ключа - string
.
На данный момент поддерживается 3 типа ключей в клиентской части: string
, guid
и number
. В других случаях при построении запросов к OData-бакенду будет выбрасываться исключение.
guid
.inverse-связи
Задание inverse-связи используется, например, при работе с детейлами.
Задание связи от агрегатора к детейлу.
var Model = BaseModel.extend({
...
orders: DS.hasMany('order', { inverse: 'employee', async: false }),
});
Задание связи от детейла к агрегатору.
var Model = BaseModel.extend({
// ...
employee: DS.belongsTo('employee', { inverse: 'orders', async: false })
});