Вложенные фоновые ресурсы в Ember - PullRequest
0 голосов
/ 23 февраля 2019

Этот вопрос может быть дублирующим, но я не смог найти ответ.

У меня есть Rails API, обслуживающий URI, подобный этому:

/locations/1/visits

In EmberУ меня есть такой маршрут:

Router.map(function() {
  this.route('location', { path: '/locations/:location_id' }, function() {
    this.route('visits' , { path: 'visits' });
 });
});

.. и модель, подобная этой:

export default DS.Model.extend({
  name:           DS.attr(),
  visits:         DS.hasMany('visit', { nested: true }),
});

Когда я нажимаю / location / 1 / посещения вв браузере, я ожидаю, что Ember также нажмет / location / 1 / посещения на серверной части.Вместо этого он пытается / location / 1 (без посещений).

Есть идеи, как убедить Эмбер правильно вкладывать ассоциацию?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Я закончил тем, что отказался от вложенных маршрутов в пользу плоской, "симулированной" схемы вложений, но заимствовал методику @ NullVoxPopuli (спасибо!):

Router.map(function() {
  this.route('visits',   { path: 'locations/:location_id/visits' });
  this.route('visit',    { path: 'locations/:location_id/visits/:id' });
  this.route('checkout', { path: 'locations/:location_id/visits/:id/checkout'} );
});

... и затем внутри / маршруты/visits.js:

export default Route.extend({
  model(params) {
    let locationId = params.location_id;
    this.set('locationId', locationId);
    this.store.adapterFor('visit').set('namespace', '/locations/' + locationId);
    let visitsForLocation = this.store.findAll('visit');

    return visitsForLocation;
  }
});

Поскольку для меня не важно разрешить ресурс Location, этот подход, похоже, работает нормально.

0 голосов
/ 23 февраля 2019

внешняя маршрутизация - это не то же самое, что внутренняя маршрутизация.

Самый простой способ представить себе внешнюю маршрутизацию - это «вложенные представления», а не вложенные ресурсы.

Итак, что касается полученияданные (если у вас еще нет ваших данных), вам нужен файл маршрута по этому пути:

app / router / location / посещения.js (я думаю, вы также можете ember g route location/visits и посмотреть, чтобывает)

Затем в вашем маршруте:

import Route from '@ember/routing';

export default class LocationVisitsRoute extends Route {
  // this is the route lifecicle hook that actually gets the data
  // more on that here: https://guides.emberjs.com/release/routing/
  async model(params) {
    // this assumes that your location route loads the location resource
    // similar to how we're trying to load the visits resources is this route.
    let locationId = this.modelFor('location').location.id;

    // you could also get the location id from params,
    // but I don't remember the exact path where the id would live.
    console.log(params);

    // this is kind of hacky, and I wouldn't really recommend it, as there may
    // be concurrency issues. but this technique was taken from here:
    // https://discuss.emberjs.com/t/current-way-to-handle-nested-resources/7477/7
    this.store.adapterFor('visit').set('namespace', `/api/locations/${locationId}`);
    let visitsForLocation = await this.store.findAll('visit');

    return { 
      visits: visitsForLocation,
   };

  }
}

Затем в вашем шаблоне для посещений вы можете сделать

{{#each model.visits as |visit|}}

  <h1>{{visit.name}}</h1>

{{/each}}

в качестве альтернативы, если вы используете { json:api }, вы можете просто указать атрибут links, и все должно «просто работать»: Как использовать Ember Data с вложенными ресурсами

Итак, в общем, если вы используете{ json:api }, настройка полезной нагрузки, чтобы сообщить клиенту, где находятся ресурсы / отношения, действительно лучший способ.

...