В EmberJS как вы можете использовать данные перехода в контроллере?

Я получаю transition данные в файле маршрута js примерно так:

beforeModel(transition) { console.log(transition)  }

И я хочу использовать его в функции в моем контроллере, как это:

import Controller from '@ember/controller';

export default class ListingsController extends Controller {

    get pageTitle() {
        if (this.transition.targetName == 'foo') {
        return 'page title';

        }
      }

}

И тогда я хочу отобразить результат следующим образом:

<h1>{{this.pageTitle}}</h1>

Я не могу найти способ передать transition данные от маршрута до контроллера. Есть идеи?

2 ответа

Хотя вы технически можете использовать beforeModel чтобы получить контроллер через this.controllerFor как подсказывает @KathirMagaesh, я бы не стал выступать за это решение. Это определенно не нормальная или ожидаемая модель Ember. Кроме того, если вы посмотрите на переход API, там нет ссылки на transition.targetName, Если это работает, это частный API и, следовательно, хрупкий.

Если вам нужно изменить свойство в зависимости от текущего маршрута, вы должны использовать службу общего маршрутизатора, которая предоставляет некоторые полезные свойства для этой цели!

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

import Controller from '@ember/controller';
import { computed } from '@ember/object';
import { inject } from '@ember/service';

// this injects the router service into our component via Ember's DI framework
router: inject(),
export default Controller.extend({
  pageTitle: computed('router.currentRouteName', function(){
     let currentRoute = this.router.currentRouteName;
     if(currentRoute === 'foo'){
        return 'page title';
     } 
     // do other stuff for other routes. 
  })
})

Это использует currentRouteName, которое является именем, разделенным точкой foo.bar, Вы также можете получить доступ к URL через currentURL, который будет /foo/bar

PS. Поскольку я еще не использовал классы ES6, я предоставил решение ember старого стиля. Вы, вероятно, должны будете использовать @computed декоратор или @tracked где я использую computed функция. Я знаю только о стиле октанового тлеющего огня из RFC и потрясающих постов в блоге, но я не в курсе того, что появилось.

PPS. Если вы используете старый ember, текущие свойства имени маршрута / URL доступны на контроллере приложения.

В хуке beforeModel используйте

this.controllerFor(currentrRouteName).set('переход', переход);

Это установит свойство перехода в контроллере текущего маршрутизатора.

Подробнее о controllerFor()

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