如果我有这样的嵌套路线
App.Router.map(function() {
this.resource("foo", {path: "/foos"}, function( {
this.resource("bar", {path: "/:foo_id/bars"}, function() {
this.resource("bazz", {path: "/:bar_id"});
});
});
});
当我启动应用程序时,我需要一个FooIndexRoute来加载所有foo对象。然而,当我在最底层路线刷新时,我的FooIndexRoute没有被加载,所以我被迫在我的FooRoute中复制模型钩子
我在url结构中做错了什么,迫使我重复这项工作?
答案 0 :(得分:1)
索引路由是一个捕获所有路由,只有在您访问该资源并且尚未定义默认路由时才会触发它。您应该在路由名称本身上定义模型挂钩并放弃索引路由。
AKA
App.FooRoute = Em.Route.extend({
model: function....
})
如果您希望索引路由仍然存在,则可以在模型钩子中使用return this.modelFor('foo');
索引路由。所以你可以避免两次获取模型等。
此外,在更深的路线中,如果他们的模型只是父路线的子模型,只需使用modelFor获取父模型并过滤掉相应的项目。
如果您需要一个jsbin示例,请告诉我。
答案 1 :(得分:1)
我发现当基本路由(foo
)用于加载模型列表并且索引(foo.index
)用于显示列表时,它最有效。这是一个优势,因为{{outlet}}
路线中的foo
最初将使用foo.index
视图填充,但是一旦您选择了要追溯到foo
'的路线s插座将切换到bar
路线的信息。这通过嵌套保留foo
的控制器和模型数据。
application
├── foo
│ ├── bar
│ │ ├── bazz
│ │ └── index
│ └── index
└── index
您可以看到,如果您在foo.index
路线中加载数据,当您转换到bar
路线时,嵌套路径现在不包括foo.index
,这意味着它不是容易到达。
在子路线中,您可以使用this.modelFor('foo')
检索foo
路线的模型,并直接将其用作模型或将其添加到路线的控制器中:
App.FooRoute = Ember.Route.extend({
model: function() {
return ['red', 'yellow', 'blue'];
}
});
// use foo's model as the index's model
App.FooIndexRoute = Ember.Route.extend({
model: function() {
return this.modelFor('foo');
}
});
// this route has its own model, but also include foo's model
App.BarRoute = Ember.Route.extend({
model: function() {
return ['bar1', 'bar2', 'bar3'];
},
setupController: function(controller, model) {
this._super(controller, model);
controller.set('fooModel', this.modelFor('foo'));
}
});
这是一个显示嵌套的JSBin:http://emberjs.jsbin.com/oxAluJI/1/edit