Наличие дополнительного префикса в угасающих маршрутах - PullRequest
1 голос
/ 01 апреля 2020

Проблема

Приложение должно иметь префикс root, который является необязательным. Префикс также содержит динамический сегмент c.

Пример

Содержимое

/ posts / 1 и / account / 123 / posts / 1 имеет для загрузки того же маршрута и шаблона.

где / account / 123 - префикс. 123 - это динамический c сегмент префикса .

Требование

  1. Все URL должны быть доступны с и без * префикс.
  2. Когда загружен префиксный маршрут, все одностраничные переходы должны быть в контексте префикс-URL.

    / account / 123 / post / 1 to / account / 123 / post / 2

  3. Когда загружен маршрут без префикса, все одностраничные переходы должны быть в контексте URL-адресов без префикса.

    / post / 1 to / post / 2

Ограничения

  1. Существующая кодовая база имеет маршруты без URL префикса .
  2. Поскольку контроллеры, маршруты, шаблоны уже существуют в маршрутах без префикса , решение должно повторно использовать существующий код.

Ожидаемое решение

  1. Все функции, выполняющие спа-переходы должны видеть контекст window.location и выполнять переход к префиксу или без префикса IX путь. Это будет включать в себя такие функции, как transitionTo, replaceWith, linkTo helper и т. Д. c

    Поскольку существующий link-to-помощник и др. c будет иметь имя маршрута как post .detail ( маршруты без префиксов )

  2. Должен иметь минимальные изменения кода в существующем контроллере, маршрутах, шаблонах.

Пример существующих маршрутов

NewRouter.map(function() {
  this.route('posts', function() {
    this.route('detail',{path: "/:id"});

    this.route('comments', function() {
        this.route('detail',{path: "/:id"});
    });
  });

});

Контроллеры, маршруты, шаблоны уже существуют для post, post.detail, комментариев, комментариев. подробно.

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

У маршрутизатора Ember есть свойство rootURL. Если вы хотите обслуживать приложение для ведения блога из http://emberjs.com/blog/, необходимо указать root URL-адрес /blog/.

. Этого можно достичь, настроив свойство rootURL. на ENV:

module.exports = function(environment) {
  var ENV = {
    modulePrefix: 'my-blog',
    environment: environment,
    rootURL: '/blog/',
    locationType: 'auto',
  };
}

В вашем случае, однако, этот rootURL является динамическим c. EmberRouter имеет функцию инициализации, которую вы можете использовать для динамической установки этого значения во время выполнения перед созданием любых URL-адресов в вашем приложении путем динамической проверки загруженного URL-адреса.

export default class Router extends EmberRouter {
  init(){
    super.init(...arguments);
    // trailing slash is required for rootURL
    let acctsSubUrl = window.location.pathname.match(/^\/accounts\/\d+\//);
    if(acctsSubUrl){
      this.rootURL = acctsSubUrl[0];
    }
  }
  location = config.locationType;
  rootURL = config.rootURL;
}

Если сделайте это, пусть значение по умолчанию ENV для rootURL будет /. Это должно решить ваши требования к префиксу динамического c, который загружает для всех URL-адресов маршрутов, когда они присутствуют. Я проверил это против Ember 3.17, и он работает

0 голосов
/ 01 апреля 2020

Я не знаю, есть ли правильный ответ для этого. Я вижу несколько вариантов здесь, но прежде чем принимать их, убедитесь, что вам действительно нужна информация об учетной записи в URL, и она не может быть просто сохранена в службе.

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

//posts/detail/index.hbs
`<PostDetail @id={{@model.id}} @accountId={{null}} />
//account/posts/detail/index.hbs
`<PostDetail @id={{@model.id}} @accountId={{@model.account}} />

Вы также можете попробовать использовать engine и монтирование одного и того же маршрута дважды (по одному на каждый URL), но у двигателей есть свой собственный набор проблем.

...