2016-06-06 2 views
0

Мне нужно определить название маршрута из строки URL.Как определить название маршрута Ember по URL?

Обычно это работает с маршрутизатором внутри, но из-за {insert long story here} мне нужно сделать это вручную. Мне дается часть данных из API, которая выглядит как «галерея/123», и мне нужно знать, что имя маршрута - «gallery.post». Так что я могу сделать route.replaceWith(determinedRouteName);

  • нужно включить 'галерея/123' в '' gallery.post
  • нужно включить 'вещи/99/комментариев' в '' stuff.post.comments
  • Etc

ответ

-1

У вас всегда будет только один ID на маршруте? Или первый идентификатор всегда будет идентификатором «post» хотя бы? Если это так, это не проблема Ember, это будет просто поиск JavaScript в JavaScript, который всегда следует за тем же форматом, если данные API всегда возвращаются в том же формате.

Предполагая, что API всегда обеспечивает формат:

«что-то/: POST_ID/optionally_something_else»

Вы можете взять строку, что API при условии и запустить его через пару заменить методы:

var apiString = "stuff/99/comments"; 

apiString = apiString.replace(/[0-9]+/, "post").replace(/\//g, "."); // => "stuff.post.comments" 

// Also works with: 

var apiString = "gallery/123"; 

apiString = apiString.replace(/[0-9]+/, "post").replace(/\//g, "."); // => "gallery.post" 

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это довольно нехорошо и сломается, если строка не соответствует этому формату. Он также будет скрывать только набор цифр для «сообщения». Но, как обычно, используйте его, если вам необходимо: P

0

Эмбер полагается внутренне на router-recognizer micro lib. Я думаю, что ваш лучший вариант - использовать его.

К сожалению, доступ к экземпляру маршрутизатора в настоящее время требует опираться на частный сервис -routing. (Примечание: вот pending RFC о предоставлении услуги общего маршрутизатора).

Инъекционное эту частную службу:

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    router: Ember.inject.service('-routing'), 

    ... 
}); 

recognize функция возвращает список всех обработчиков, которые вы можете присоединиться, если вы хотите построить полную строку или что-нибудь еще.

Ex:

this.router.recognize("stuffs/99/comments"); 
> [{handler: "application", ...}, 
    handler: "stuffs", ...}, 
    handler: "stuff", ...}, 
    handler: "comments", ...}, 
    handler: "comments.index, ...}] 

Надеется, что это помогает

Смежные вопросы