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 остается пустым.

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

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

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

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

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

Войти через центр авторизации
Похожие вопросы