EMBER JS - извлекать связанные данные модели из серверной части только при необходимости

store.findRecord('school', school_id, {
                 include: [
                  'students',
                  'students.records'
                 ].join(',')

Используя приведенный выше код выборки школы, ученики записывают данные учеников в начальную нагрузку. При первоначальной загрузке мне не нужны student.records (изначально перечисляются только студенты)

Записи учеников нужны только при нажатии на какую-либо кнопку (Все успеваемости учащихся - для отображения диаграммы успеваемости). Есть ли способ отдельно выбрать связанные записи и связать их с существующей моделью?

У меня есть отдельная конечная точка API для получения записей студентов

1 ответ

выделенный текст вы можете использовать вложенный маршрут? может быть что-то вроде:

// router.js
Router.map(function() {
  // ...
  this.route('school', { path: ':school_id' }, function() {
    this.route('performance');
  });
  // ...
})

// the school route
import Route from '@ember/routing/route';

export default class extends Route {
  async model(params) {
    const { school_id } = params;

    const school = await store.findRecord(
      'school', school_id, { include: 'students' }
    );

    return { school }          
  }
}

// the performance route
import Route from '@ember/routing/route';

export default class extends Route {
  async model() {
     // get the id from the parent route
    const { school_id } this.paramsFor('school');

    const school = await store.findRecord(
      'school', school_id, { include: 'students.records' }
    );
    // depending if the relationship is async or not, students
    // will need to be awaited
    const students = await school.students;

    return { students }          
  }
}

Это все использует одно и то же schools конечная точка. Если вы хотите получить только записи учащегося, не выходя за конечную точку школы, это зависит от возможностей вашего API.

если вы хотите получить записи об отдельном ученике, вы, вероятно, захотите создать для него дополнительный маршрут и сделать что-то вроде этого:

// router.js
Router.map(function() {
  // ...
  this.route('school', { path: ':school_id' }, function() {
    this.route('performance');
    this.route('students', function() {
      this.route('student', { path: ':student_id' });
    });
  });
  // ...
})

и вы бы ссылку на этот маршрут, как это:

{{#link-to 'school.students.student' school_id student_id}}
  Student Name
{{/link-to}}

и в вашем студенческом маршруте вы захотите построить свой модельный хук следующим образом:

// the student route
import Route from '@ember/routing/route';

export default class extends Route {
  async model(params) {
     // get the id from the parent route
    const { school_id } this.paramsFor('school');
    const { student_id } = params;

    const student = await store.findRecord(
      'student', student_id, { include: 'records' }
    );

    // depending if the relationship is async or not, students
    // will need to be awaited
    const records = await student.records;

    return { student, records };     
  }
}

Возможно, вы захотите открыть еще один вопрос о вашем API, если вы не знаете, как с ним взаимодействовать. Там мы могли бы изучить, как он структурирован, например, если это http://jsonapi.org/ API или нестандартный API для отдыха.

надеюсь это поможет.

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