У меня есть модель домена, в которой есть клиент, который, в свою очередь, имеет 1 адрес (1: 1) и 1 или более телефонных номеров (1: M). У клиента есть PK, предоставленный пользователем (строка), в то время как Address и Phone используют столбец идентификаторов (сгенерированный сервером).
Я изо всех сил пытаюсь понять, как управлять созданием объекта Breeze для экрана «Добавить нового клиента». Форма на экране позволяет пользователю вводить данные клиента, адреса и телефона.
Я использую Durandal и Knockout, поэтому моя модель представления «customeradd.js» выглядит примерно так:
// -- snip ---
var customer = ko.observable(),
hasChanges = ko.computed(function () {
return datacontext.hasChanges();
});
var vm = {
hasChanges: hasChanges,
customer: customer,
activate: activate
};
return vm;
function activate() {
customer(datacontext.createCustomer());
}
// -- snip ---
и мой "/services/datacontext.js":
// -- snip ---
breeze.NamingConvention.camelCase.setAsDefault();
var manager = new breeze.EntityManager(config.remoteServiceName);
var hasChanges = ko.observable(false);
manager.hasChangesChanged.subscribe(function (eventArgs) {
hasChanges(eventArgs.hasChanges);
});
function createVehicle() {
return manager.createEntity("Customer");
}
// -- snip ---
Мои вопросы следующие:
- После того, как я создам клиента, мне нужно создать адрес и список телефонов и добавить их в сущность клиента, прежде чем сделать его наблюдаемым KO? Или это делается автоматически методом createEntity()?
- Как создать клиента, но без указания идентификатора? Если я устанавливаю для ключа значение null или '', Breeze жалуется ("Ошибка: невозможно прикрепить объект к EntityManager без предварительной установки его ключа или установки его свойства entityType 'AutoGeneratedKeyType' в значение, отличное от 'None'"). Однако, если я генерирую временный ключ (используя либо breeze.core.getUuid(), либо что-то еще), то он отображается в моем поле формы Id, и я действительно хочу, чтобы конечный пользователь указал его... У меня есть прибегнуть к расширению объекта дополнительным полем, а затем выполнить замену и проверку перед сохранением (мне эта идея вообще не нравится)? Есть ли способ лучше?
- Чтобы включить/отключить кнопки в моей форме, я отслеживаю, есть ли изменения в EntityManager. Но каждый раз, когда сущность создается, она автоматически находится в состоянии «добавлено», поэтому hasChanges имеет значение true. Я хочу, чтобы изменения принимались только в том случае, если пользователь редактирует форму (и, следовательно, вносит изменения в базовый объект). Как лучше всего подойти к этому?
Кстати, я видел эту рекомендацию зарегистрировать собственный конструктор для объекта (я уже реализовал его, но до сих пор не понимаю, как чтобы пользователь мог указать свой собственный идентификатор и пометить объект как измененный только тогда, когда пользователь редактирует его...)