Ember.js - доступ к вложенным данным через сериализатор

Как лучше всего получить доступ к одной вложенной записи в Ember?

Ответ JSON, которым мы пытаемся управлять, возвращается в следующем виде: (целевой атрибут - это свойство tradeIdentifier)

trade:
    tradeIdentifier:"83f3f561-62af-11e7-958b-028c04d7e8f9"
    tradeName:"Plumber"
userEmail:"[email protected]"

Модель project-user частично выглядит так:

  email: attr('string'),
  trade:attr(),
  tradeId: attr(),

Частично сериализатор project-user выглядит так:

export default UndefinedOmitted.extend(EmbeddedRecordsMixin, {
  primaryKey: 'userRoleId',
  attrs: {
    'email': { key: 'userEmail' },
    'trade': { key: 'trade' },
    'tradeId': { key: 'tradeIdentifier' },
  },
});

Атрибут trade здесь является заполнителем, чтобы убедиться, что данные были доступны. Я хотел бы иметь доступ к tradeIdentifier, не выполняя в компоненте следующие действия:

const trade = get(formRole, 'trade');
if (trade) {
  set(formProps, 'tradeId', trade.tradeIdentifier);
}

Тестировали создание преобразования trade-id (ссылка на tradeId: attr('trade-id')), но безрезультатно.

export default Transform.extend({
  deserialize(val) {

    const trade = val;
    const tradeId = val.tradeIdentifier;

    return tradeId;
  },
  serialize(val) {
    return val;
  },
});

Может ли кто-нибудь подсказать, где я ошибаюсь?

Преобразование должно быть применено к вашему trade, значение для tradeId пусто, потому что у вас нет свойства с именем tradeIdentifier в вашей полезной нагрузке. Вы пробовали использовать вложенный ключ на attrs? Как attrs: { tradeId: { key: 'trade.tradeIdentifier' } }. Сам никогда не пробовал, но может сработать.

jelhan 24.07.2018 11:24

@jelhan - да, попробовал attrs: { tradeId: { key: 'trade.tradeIdentifier' } }, похоже, не работает (было бы неплохо, если бы это было). Закончилось заставить преобразование работать; опубликую решение ниже.

Ryan Achten 24.07.2018 23:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Преобразование кажется излишним для того, чего я здесь пытаюсь достичь, однако оно выполняет свою работу. Удалось заставить его работать, изменив следующее:

В сериализаторы / проект-user.js:

'tradeId': { key: 'trade' },

Обратите внимание, что это ссылается на свойство в полезной нагрузке для преобразования, а не на целевое свойство (что было моей ошибкой).

В модели / проект-user.js:

tradeId: attr('trade-id'),

Атрибут ссылается на преобразование.

В преобразовать / trade-id.js:

export default Transform.extend({
  deserialize(val) {

    let tradeId = val
    if (tradeId) {
      tradeId = val.tradeIdentifier;
    }

    return tradeId;
  },
  serialize(val) {
    return val;
  },
});

Если есть более простое решение помимо преобразований, я все равно буду открыт для предложений.

Другие вопросы по теме