Получить текущее название маршрута в Ember
Мне нужно получить текущее имя маршрута в моем приложении ember; Я попробовал это:
Ember App.Router.router.currentState undefined
но это не работает для меня (есть probablig что-то, что я missimg...) Я использую Ember rc6, и у меня есть многоязычное приложение; в applicationRoute я обнаруживаю язык браузера, и я перенаправляю на правильную страницу с помощью:
this.transitionTo(userLang);
но я хотел бы, чтобы это было выполнено только тогда, когда пользователь находится на главной странице, так что примерно так:
if (currentRoute == 'home'){
this.transitionTo(userLang)
}
Ответы
Ответ 1
Вы можете наблюдать за application
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);
}
Надеюсь, что это поможет.
Ответ 2
Это работало для меня на 1.3.0-бета (и быстрый взгляд на источник для 1.1.2 предполагает, что это также будет работать там):
App.__container__.lookup('router:main').location.lastSetURL
Обратите внимание, что в документации говорится:
В настоящее время он использует событие hashchange, существующее в браузере.
Однако я считаю, что настоятельно рекомендуется, чтобы App.__container__
не использовался в производственном коде. Более приемлемой альтернативой было бы использование App.Router.router.currentHandlerInfos
, который предоставляет информацию о текущем маршруте Ember.
Еще одним вариантом является currentRouteName
на ApplicationController
. Вы можете добавить needs: ['application']
к своему контроллеру, а затем получить доступ к имени маршрута с помощью controllers.application.currentRouteName
. Это вернет что-то вроде posts.index
.
Ответ 3
При переходе на компоненты сложнее получить имя маршрута. Лучший способ - добавить инициализатор, например
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
Ответ 4
Если вы хотите получить текущий маршрут в вашем компоненте или контроллере, вы можете routing: Ember.inject.service('-routing')
сервис routing: Ember.inject.service('-routing')
(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('routing.currentRouteName', function() {
return this.get('routing.currentRouteName');
})
})
Пример с контроллером и вычисляемым свойством:
import Ember from 'ember';
export default Ember.Controller.extend({
routing: Ember.inject.service('-routing'),
checkMyRouteName: Ember.computed('routing.currentRouteName', function() {
return this.get('routing.currentRouteName');
})
})
Текущий маршрут в вашем маршруте, вам просто нужно this.routeName
Пример с маршрутом:
import Ember from 'ember';
export default Ember.Route.extend({
checkMyRouteName() {
return this.routeName;
}
})
Ответ 5
Как и обновление, в Ember 1.8.1 мы можем получить имя маршрута внутри объекта Ember.Route, выполнив this.routeName
.
Ответ 6
В настоящее время с Ember 1.7.0 вы можете получить текущий маршрут из маршрута, вызвав this.routeName
.
Ответ 7
API-интерфейс Ember namespace теперь имеет 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
.
Ответ 8
Ember имеет 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"
.
Ответ 9
У меня была такая же проблема некоторое время. затем я начал изучать маршрутизатор. Он всегда имеет объект состояния, который можно получить из любого маршрута, используя
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" }
Ответ 10
Вы можете просто проанализировать текущий 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')
{
// ...
}