Подтвердить что ты не робот

Получить текущее название маршрута в Ember

Мне нужно получить текущее имя маршрута в моем приложении ember; Я попробовал это: Ember App.Router.router.currentState undefined но это не работает для меня (есть probablig что-то, что я missimg...) Я использую Ember rc6, и у меня есть многоязычное приложение; в applicationRoute я обнаруживаю язык браузера, и я перенаправляю на правильную страницу с помощью:

this.transitionTo(userLang);

но я хотел бы, чтобы это было выполнено только тогда, когда пользователь находится на главной странице, так что примерно так:

if (currentRoute == 'home'){
  this.transitionTo(userLang)
}
4b9b3361

Ответ 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')
{
// ...
}