styv
@styv

ExtJS Новая модель, сейв и hasMany связь

Добрый день.
Появилась проблема с моделями и связями. Есть примерно такая схема моделей:
Ext.define('App.model.Server', {
    extend: 'Ext.data.Model',
    
    fields: [...],

    hasMany: [
       {
            name: 'ports',
            model: 'App.model.Port',
            foreignKey: 'server_id',
            associationKey: 'ports'
       }
    ]
});

Ext.define('App.model.Port', {
    extend: 'Ext.data.Model',

    fields: [
        'server_id',
        ...
    ]
});

Так вот проблема в том, что мне нужно создать новую модель сервера и добавить в нее порты (в еще не сохраненную модель) и отправить это все на бэкэнд. Сохранять решил в два этапа, сначала модель сервера, потом порты.

Но вся проблема в том, что после сохранения модели сервера, бэкэнд отдает сохраненный айдишник для модели, но этот айдишник не ассайнится для вложенных моделей портов, т.е. server_id остается пустым.

Может кто подскажет куда копать? ))

Пока варианта два: либо пройтись по стору и заполнить айдишник сервера либо переписать райтер и попытаться отправлять порты вместе с сервером в одном запросе, не знаю насколько это будет удобно при редактировании/удалении портов.

Спасибо!
  • Вопрос задан
  • 2811 просмотров
Решения вопроса 1
styv
@styv Автор вопроса
Некогда было ответить на свой же вопрос, но вот решение, которое было применено:
https://gist.github.com/yuristrelets/9b543be8cd8af...

Немного поясню:
В copyFrom скопирован “оригинальный” код метода, хотя можно было бы вызвать callParent, но тогда пришлось бы опять повторить все проверки.
Код метода updateHasManyAssociations достаточно прост, он принимает единственный аргумент - id новой модели.
Здесь проходим по всем ассоциациям модели, но “реагируем” только на тип hasMany. Дальше обновляем поле с внешним ключом (хранится в переменной foreignKey) для всех записей связанного стора. Это необходимо для записей, которые уже находятся в сторе.
Для того, чтобы внешний ключ устанавливался автоматически для записей, которые будут добавлены позже мы ищем свойство modelDefaults стора и обновляем в нем свойство с именем внешнего ключа. Объект modelDefaults хранит все дефолтные значения для добавляемых моделей и используется в методе insert стора.
Ну и последний этап - обновляем значение фильтра для связанного стора, это может пригодится для дальнейшей его перезагрузки.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы