如何使用ember.js路由器表示“图形”(非树)结构?

时间:2014-09-03 09:47:39

标签: ember.js

ember路由器提供了一个很好的资源分支结构(在我的例子中,内容是嵌套在父页面中的面板内的资源),例如:

   app
   / \
  A   B
 /   / \
C   D   E

但我的问题是,在我的两个页面中,我链接回常见内容,例如A和A页面。 B在小组中有内容C:

   app
   / \
  A   B
   \ / \
    C   D

" C"必须有两条不同的路线,因为我希望能够指定 mysite.com/A/C mysite.com/B/C 不同 - 两者都有" C"在面板中但周围的页面会有所不同。但是控制器以及在很大程度上C的模板在两个地方是相同的,所以我怎么会有两个不同的路线,共享一个共同的控制器和模板,(和奖励点,我怎么会然后通知模板父母是什么,所以我可以根据它进行微妙的调整?)

2 个答案:

答案 0 :(得分:1)

如果它们大致相同,但略有不同,我会为每条路线创建基础控制器/路径/视图并从中扩展。命名空间每条路线略有不同。

App.Router.map(function(){
  this.resource('A', function(){
    this.resource('AC', function(){

    });
  });
  this.resource('B', function(){
    this.resource('BC', function(){

    });
    ...
  });
});



App.BaseCRoute = Em.Route.extend({
  model: function(){
    return { foo: 'bar'};
  }
});

App.ACRoute = App.BaseCRoute.extend({
  // use the same model hook
});

然后,控制器和视图的模式继续存在,基类中存在共享逻辑,扩展类中存在唯一逻辑。如果要共享模板,可以定义要在视图中使用的模板,或者在路径的renderTemplate挂钩中指定它。

答案 1 :(得分:0)

您可以自由扩展(甚至别名)您自己的控制器,因此您可以执行以下操作:

App.CController = Ember.Controller.extend({...})

App.ACController = App.CController.extend()
// or (I believe) equivalently, if you don't need to make any /A/C-specific adjustments:
// App.ACController = App.CController

App.BCController = App.CController.extend()

这将使Ember解析器能够轻松找到适合您路线的控制器,即使您只定义一次控制器代码。

就模板而言,您可以覆盖路线中的renderTemplate(如我在其他问题中建议的那样可能重复),或者您可以定义两个"默认"模板调用相同的部分。因此templates / c.hbs将包含您的实际模板,而templates / a / c.hbs和templates / b / c.hbs可能只包含一行{{partial 'c'}}