从Ember路由添加和检索元数据

时间:2015-05-22 18:04:07

标签: ember.js

出于报告目的,我想将一些元数据与Ember路线相关联,并希望按以下方式进行:

this.route('list', { path: '/list', description: 'Master List' });
然后

从路由本身或其他地方访问此description属性,例如应用程序路由器上的didTransition挂钩。我已经回顾了路由器和路由的来源,并且不能说我真的理解它,当然不能很好地理解如何检索以这种方式指定的自定义属性。我看到有一个名为DSL的对象,它显然是thisthis.route方法中指定的map的{​​{1}},但无法看到如何从此处获取那里。在Router的子类中,我看到了名为Ember.Routethis.router的属性,但我们不清楚它们指向的是什么。

或者,如果允许我按照自己的意愿行事,以下内容也会有效:

this.router.router

我可以将自定义属性与this.route('list', { path: '/list' }, function() { this.description = "Master List"; }); 中指定的路由相关联,如果是,如何关联?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果不扩展Ember的路由器,一个选项就是拥有一个维护路由元数据的独立对象。简单的例子:

<ProjectReference>

访问this.route('list', { path: '/list' }); routeMetaData['list'] = 'Master List'; 挂钩中的元数据:

didTransition

答案 2 :(得分:0)

我最终按照以下几行解决了这个问题,编写了我自己的“路由”功能,记录了我需要的数据,然后将其传递给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});
});