В 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()