Получить текущее название маршрута в 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')
{
// ...
}
Другие вопросы по тегам