Получить текущее название маршрута в Ember
Мне нужно получить имя текущего маршрута в моем приложении ember; Я попробовал это: Ember App.Router.router.currentState не определен, но он не работает для меня (есть вероятность, что я что-то упустил...) Я использую Ember rc6 и у меня многоязычное приложение; в приложении Route я определяю язык браузера и перенаправляю на нужную страницу с помощью:
this.transitionTo(userLang);
но я бы хотел, чтобы это выполнялось только тогда, когда пользователь находится на домашней странице, так что-то вроде этого:
if (currentRoute == 'home'){
this.transitionTo(userLang)
}
11 ответов
Вы могли наблюдать application
"s currentPath
и установите его на текущий маршрут соответственно, когда он изменится:
App = Ember.Application.create({
currentPath: '',
});
App.ApplicationController = Ember.Controller.extend({
updateCurrentPath: function() {
App.set('currentPath', this.get('currentPath'));
}.observes('currentPath')
}),
Таким образом, у вас есть доступ к currentPath
когда ты захочешь App.get('currentPath');
Например
if (App.get('currentPath') == 'home'){
this.transitionTo(userLang);
}
Надеюсь, поможет.
Это работало для меня на 1.3.0-бета (и быстрый взгляд на источник для 1.1.2 предполагает, что это также будет работать там):
App.__container__.lookup('router:main').location.lastSetURL
Обратите внимание, что в документации говорится:
At present, it relies on a hashchange event existing in the browser.
Тем не менее, я считаю, что настоятельно рекомендуется App.__container__
не использоваться в производственном коде. Более приемлемой альтернативой будет использование App.Router.router.currentHandlerInfos
, который предоставляет информацию о текущем маршруте Ember.
Еще один вариант currentRouteName
на ApplicationController
, Можете добавить needs: ['application']
к вашему контроллеру, затем получите доступ к названию маршрута с помощью controllers.application.currentRouteName
, Это вернет что-то вроде posts.index
,
При переходе к компонентам сложнее получить название маршрута. Лучший способ - добавить инициализатор, такой как
ember g initializer router
(из командной строки) и
export function initialize(application) {
application.inject('route', 'router', 'router:main');
application.inject('component', 'router', 'router:main');
}
export default {
name: 'router',
initialize
};
в инициализаторах /router.js. Вы также можете ввести в контроллер, если вам нужно. Тогда просто сделай просто
this.get('router.currentRouteName');
в JS или
{{router.currentRouteName}}
в шаблоне.
Это единственный способ, который я нашел, чтобы получить его надежно и наблюдаемый в Ember 2.4
Если вы хотите получить текущий маршрут в вашем компоненте или контроллере, вы можете добавить сервис маршрутизации (routing: Ember.inject.service('-routing')
)
(для более) и использовать:
this.get('routing.currentRouteName')
или же this.get('routing.currentPath')
Пример с компонентом и вычисляемым свойством:
import Ember from 'ember';
export default Ember.Component.extend({
routing: Ember.inject.service('-routing'),
checkMyRouteName: Ember.computed(function() {
return this.get('routing.currentRouteName');
})
})
Пример с контроллером и вычисляемым свойством:
import Ember from 'ember';
export default Ember.Controller.extend({
routing: Ember.inject.service('-routing'),
checkMyRouteName: Ember.computed(function() {
return this.get('routing.currentRouteName');
})
})
Текущий маршрут в вашем маршруте вам просто нужен this.routeName
Пример с маршрутом:
import Ember from 'ember';
export default Ember.Route.extend({
checkMyRouteName() {
return this.routeName;
}
})
В качестве обновления в Ember 1.8.1 мы можем получить routeName внутри объекта Ember.Route, выполнив this.routeName
,
API пространства имен Ember теперь имеет getOwner
метод, который очень полезен для поиска currentRouteName
или другие свойства маршрута.
const owner = Ember.getOwner(this);
const currentRoute = owner.lookup('router:main').currentRouteName;
const routeInfo = owner.lookup(`route:${currentRoute}`).get('info');
// etc.
Я создал пример Ember Twiddle для демонстрации. Используйте ввод текста над панелью "Вывод", чтобы перейти к другим маршрутам, таким как /blue
, /green
, или же /red
,
Начиная с Ember 1.7.0, вы можете получить текущий маршрут из маршрута, позвонив this.routeName
,
Эмбер имеет RouterService
с 2.15. Он предоставляет имя текущего маршрута как currentRouteName
собственность. Polyfill существует для Ember 2,4 - 2,14, если вы все еще на такой старой версии.
import Component from '@ember/component';
export default Component.extend({
router: service(),
isHomeRoute: computed('router.currentRouteName', function() {
return this.router.currentRouteName === 'home';
}),
});
Все другие упомянутые здесь решения полагаются на частный API, который, возможно, уже устарел / удален. С помощьюRouterService
работает как минимум с текущей версией, которая 3.12
на момент написания этого.
Обратите внимание, что "home"
не является /
. Корневой URL называется"index"
.
У меня была такая же проблема некоторое время. Затем я начал изучать маршрутизатор. У него всегда есть объект состояния, который можно получить по любому маршруту, используя
var route = this;
var handlerInfos = route.get("router.router.state.handlerInfos");
var currRouteHandlerInfo = handlerInfos[handlerInfos.length-1];
var currRouteName = currRouteHandlerInfo.name; //"home"
вот и все. Теперь у вас есть текущее название маршрута!
если вы хотите текущие параметры маршрута,
var routerParams = this.get("router.router.state.params");
var currRouteParams = routerParams[currRouteName]; //{ homeId : "1" }
это сработало для меня в файле Route.js:this.controller.target.currentPath
Вы можете просто разобрать текущий URL. Таким образом, вы можете использовать свой полный URL, например:
http://127.0.0.1:8000/index.html/#/home
и извлеките из этой строки суффикс:
/home
который является текущим названием маршрута.
Простая функция JS (которая работает независимо от вашей версии Ember) будет:
function getCurrentRoute()
{
var currentRoute;
var currentUrl = window.location.href; // 'http://127.0.0.1:8000/index.html/#/home'
var indexOfHash = currentUrl.indexOf('#');
if ((indexOfHash == -1) ||
(indexOfHash == currentUrl.length - 1))
{
currentRoute = '/';
}
else
{
currentRoute = currentUrl.slice(indexOfHash + 1); // '/home'
}
return currentRoute;
}
Пример использования:
if (getCurrentRoute() == '/home')
{
// ...
}