EMBER JS - получать связанные данные модели из серверной части только при необходимости - PullRequest
0 голосов
/ 09 октября 2018
store.findRecord('school', school_id, {
                 include: [
                  'students',
                  'students.records'
                 ].join(',')

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

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

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

1 Ответ

0 голосов
/ 09 октября 2018

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

// 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, если вы не знаете, как с ним взаимодействовать.Там мы могли бы исследовать, как он структурирован, например, если это API http://jsonapi.org/ или нестандартный API отдыха.

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

...