В EmberJS как вы можете использовать данные перехода в контроллере? - PullRequest
1 голос
/ 04 июня 2019

Я получаю данные 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 ]

3 голосов
/ 04 июня 2019

Хотя вы технически можете использовать beforeModel для получения контроллера через this.controllerFor, как подсказывает @KathirMagaesh, я бы не стал выступать за это решение. Это определенно не нормальный или ожидаемый паттерн Ember. Кроме того, если вы посмотрите на transition 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 доступны на контроллере приложения.

2 голосов
/ 04 июня 2019

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

this.controllerFor (currentrRouteName) .set ('transition', transition);

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

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

...