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的模板在两个地方是相同的,所以我怎么会有两个不同的路线,共享一个共同的控制器和模板,(和奖励点,我怎么会然后通知模板父母是什么,所以我可以根据它进行微妙的调整?)
答案 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'}}
。