Добавление и получение метаданных с маршрутов 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];
}