Добавление и получение метаданных с маршрутов Ember
Для целей отчетности я хочу связать некоторые метаданные с маршрутом Ember и предпочитаю делать это следующим образом:
this.route('list', { path: '/list', description: 'Master List' });
то получите доступ к этому свойству description
из таких мест, как сам маршрут или из другого места, например крюк didTransition
на маршрутизаторе приложения. Я просмотрел источник для Router и Route и не могу сказать, что я действительно понимаю его, конечно, недостаточно хорошо, чтобы понять, как получить настраиваемые свойства, указанные таким образом. Я вижу, что есть объект с именем DSL, который, по-видимому, является this
this.route
, указанным в методе map
на Router
, но не может видеть, как добраться отсюда до него. Из подкласса Ember.Route
я вижу свойства с именем this.router
и this.router.router
, но неясно, на что они указывают.
Или также будет работать следующее, если это позволит мне делать то, что я хотел:
this.route('list', { path: '/list' }, function() {
this.description = "Master List";
});
Можно ли связать пользовательские свойства с маршрутом, указанным в Router#map
, и если да, то как?
Ответы
Ответ 1
Я решил решить это в следующих строках, написав свою собственную функцию "route", которая записывает нужные мне данные, затем передает ее вместе с DSL:
var myRouteData = {};
function route(dsl, name, options, fn) {
if (typeof options === 'function') fn = options, options = {};
var routeName = dsl.parent ? dsl.parent + '.' + name : name;
myRouteData[routeName] = { options.myRouteOption };
dsl.route(name, options.fn);
}
Использование:
this.resource('foo', function() {
route(this, 'bar', {myRouteOption: true});
});
Ответ 2
Как представляется, нет элегантный способ установки метаданных о маршруте, когда он определен в маршрутизаторе, но, возможно, попробуйте это уродливое решение в вашем контроллере приложений:
currentPathChange: function () {
switch(this.get('currentPath')){
case 'test.index':
console.log('test.index is the foo!');
break;
case 'test.new':
console.log('test.new is the bar!');
break;
}
}.observes('currentPath')
JSBin DEMO
Ответ 3
Без расширения Ember Router одним из вариантов является наличие отдельного объекта, который поддерживает метаданные маршрута. Простой пример:
this.route('list', { path: '/list' });
routeMetaData['list'] = 'Master List';
Чтобы получить доступ к метаданным в didTransition
:
didTransition: function() {
var metadata = routeMetaData[this.routeName];
}