Рубрики
Без рубрики

Распределение родительской модели по границам маршрута

Просто на прошлой неделе Alex Lafroshia выпустил новый аддон под названием Ember Context, и я хотел поделиться некоторыми узорами, которые я использовал в прошлом, что этот аддон меняется. Проблема иногда …

Автор оригинала: Ilya Radchenko.

Просто на прошлой неделе Алекс Лафрозия Выпустил новый аддон под названием Эмбер контекст И я хотел поделиться некоторыми узорами, которые я использовал в прошлом, что этот аддон меняется.

Проблема

Иногда у вас есть интернет-интерфейс, где на определенном уровне у вас есть несколько вложенных маршрутов, и они имеют дело с одним из родителей. Например, если у вас была система управления блогами, которая поддерживает несколько блогов, вы можете иметь маршрут, как Dashboard.blog.post.edit и Блог Модель найден в Dashboard.blog маршрут. Поэтому в этот момент вы хотите использовать эту же модель блога в других маршрутах. Исторически там никогда не было отличного способа сделать это, вы, возможно, подумать, поместите его на сервис, но тогда вам нужно зарегистрироваться и очистить эту услугу, поскольку услуги являются глобальными. Наряду с этим неудобством также неясно, где служба получает свои данные, кажется немного магии.

Прошлое

В прошлом я решил эту проблему с Модельфер Метод маршрута, что-то вроде:

import Route from '@ember/routing/route';
import { inject as service } from '@ember/service';

export default class PostEditRoute extends Route {
  @service store;
  
  async model({ postId }) {
    let blog = this.modelFor('dashboard.blog');
    let post = await this.store.findRecord('post', postId);
    return { blog, post };
  }
}

Теперь я могу получить доступ к блогу в моем шаблоне через {{@ model.blog}} И все это работает. Проблема вот что Модельфер вернется любые данные, которые вы вернулись в Модель крючок Dashboard.blog Маршрут, и это может измениться на объект предметов, таких как {config, blog} И теперь вам нужно посетить каждый Модельфер и изменить там предположение. В тех случаях, когда маршрут не имеет никаких других моделей данных, необходимых, вам придется добавить файл маршрута и сделать весь танец.

Настоящее

С новым Эмбер-контекст Addon, мы можем изменить это на что-то с меньшим количеством котельной, а немного яснее о том, откуда приходят данные. С помощью этого дополнения мы определим следующее в нашем Dashboard.blog шаблон:


  {{outlet}}

Сейчас в нашем Dashboard.blog.post.edit Шаблон мы можем использовать эту модель блога, используя помощника: {{потребляйте-контекстный блог '}} :

{{#let (consume-context 'blog') as |blog|}} 
  {{! use it here }}
{{/let}}

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

import Component from '@glimmer/component';
import { inject as context } from '@alexlafroscia/ember-context';

export default class PostEditor extends Component {
  @context('blog') blog;
}

Это становится еще более мощным, когда вы создаете пользовательский класс и используете @tracked и @action который может потребляться на верхнем уровне, но вложенные маршруты также могут повлиять на состояние этого класса. Там у вас есть! Вы нашли аналогичные модели, которые улучшаются экстра контекста? Дайте мне знать на Twitter.