2015-02-02 5 views
0

На моей главной странице (index.hbs) мне нужно отобразить список ссылок на каждый маршрут, который соответствует заданным критериям (например, имеет определенный атрибут). Так что мне нужно что-то вроде этого:Получение списка маршрутов в Ember.js

// Define a route with some attribute 
App.FirstRoute = Ember.Route.extend({ 
    showOnIndex: true 
}); 

// Get a list of visible routes in the IndexController 
visibleRoutes: function() { 
    var routes = /* How to do this */ 
    return routes.filter(function(route) { 
     route.get('showOnIndex')); 
    }); 
}.property() 

Проблема заключается в том, как получить routes. Я обнаружил, что я могу получить список имен маршрутов по:

var router = this.get('target'); 
var names = router.router.recognizer.names; 

Но я не могу найти, как перевести их в Route объектов. Предположительно, у Router есть информация, чтобы сделать это, но AFAICS не публикуется публично. Какие-либо предложения?

+0

Вы попробовали firefox или chrome tab-plugin для emberjs? рекламируется, что он может показывать маршруты? https://github.com/emberjs/ember-inspector – Blauharley

+0

Да, я использую это, но как это должно помочь? – aquavitae

ответ

1

Что относительно использования контейнера и поисков?

Ember.keys(App.Router.router.recognizer.names).map(function(name) { 
    return App.__container__.lookup('route:' + name); 
}).compact(); 

Я знаю, что вы обращаетесь к __container__, который является частным. Но, как правило, вы все равно не должны обращаться ко всем маршрутам.

1

Это один из способов сделать это, хотя я думаю, что это немного ужасно и, возможно, даже опасно долгое время, поскольку он использует функции Javascript, а не API Ember. Мы начинаем с получения маршрутов через ваш объект «App». Вы можете получить список всех классов, которые он содержит, с помощью Object.keys (App). Затем вы можете пройти через каждый из них, проверить, является ли это маршрут с .superclass, который будет Ember.Route, если это маршрут. Затем вы можете проверить свойство showOnIndex на прототипе каждого из них.

var allRoutes = []; 
Object.keys(App).forEach(function(key, index, allKeys) { 
    if (App[key].superclass === Ember.Route && App[key].prototype.showOnIndex === true) { 
     allRoutes.push(App[key]);  
    } 
}); 

Теперь у нас есть массив всех имен классов маршрутов, которые имеют showOnIndex истины.

Однако у вас все еще есть проблема выравнивания имен из распознавателя с именами классов Route, но поскольку путь Ember заключается в том, что маршрут, такой как my/url, будет отображаться в MyUrlIndexRoute и 'my.url.index' и т. д., тогда вы можете разделить маршрут по верхнему регистру, удалить последнюю часть («Маршрут»), объединить их и преобразовать все в нижний регистр.

var routesByName = []; 
allRoutes.forEach(function(name, index, all) { 
    var names = name.match(/[A-Z][a-z]+/g); 
    names.pop(); 
    var routeName = names.join('.').toLowerCase(); 
    routesByName.push(routeName); 
}); 

Тогда вы можете просто цикл через routesByName в шаблоне и создать {{#link-to}} для каждого из них.

Я думаю, что лучший способ достичь того, что вы хотите, это сохранить карту всех маршрутов до их значения showOnIndex отдельно от вашего приложения и просто обновить его для каждого нового, которое вы хотите добавить. Это может быть более безопасным в долгосрочной перспективе, поскольку кто знает, как внутреннее состояние Ember изменится в будущем, что может помешать выполнению некоторых вещей выше.

Обратите внимание, что я проверил все это в режиме отладчика в приложении Ember в Chrome, но не запустил все фрагменты кода, поэтому извиняюсь за любые ошибки.

+0

Да, очень хакерский ... Если мои варианты - это обратное проектирование маршрутизатора или ручное отслеживание маршрутов, то последнее, безусловно, предпочтительнее, но я надеялся на метод, выставленный ember или, по крайней мере, явно реализованный ember. – aquavitae

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