我有一个如下所示的路由器:
App.Router.map(function () {
this.resource('foo', { path: 'foo/:foo_id' }, function() {
...
}
});
当我访问/foo/1
时,它会自动正确加载模型并显示。但是,我想使用afterModel
挂钩进行一些重定向(reference)。为了调试我做了这个:
App.FooIndexRoute = Ember.Route.extend({
afterModel: function(model, transition) {
console.log(model); // This returns `undefined`
}
});
但它会记录undefined
。
然后我尝试手动检查模型中的参数:
App.FooIndexRoute = Ember.Route.extend({
...
model: function(params) {
console.log(params); // This returns an empty queryParams object
}
});
但是,它记录了queryParams
对象,但没有ID。
我理解我可能会误解动态细分ID的可访问位置,例如它是否只能从FooRoute
访问?如果是这样的话,为什么你会使用这条路线来考虑你有FooIndexRoute
?
最重要的是,afterModel
挂钩不应该记录模型吗?
答案 0 :(得分:2)
直接,只能从FooRoute
App.FooRoute = Ember.Route.extend({
...
model: function(params) {
console.log(params);
}
});
FooRoute
是与资源foo相关联的实际路由。
this.resource('foo', { path: 'foo/:foo_id' }, function() {
// this.route('index'); // free route defined by Ember
...
}
FooIndexRoute
仅仅是当您点击该资源的根目录时所遇到的资源之下的路径。换句话说,如果您点击/foo/123
,Ember将使用foo
中的foo/index
模板呈现{{outlet}}
模板。当您想要在资源的根目录下显示不同的内容时,以及在资源下查看不同的路径/资源时,这非常有用。
例如,想象一下您查看帖子集合的用例。您首先访问/posts
,然后在索引路径中显示您可以单击以查看单个帖子的帖子列表。点击帖子后,您希望自己的网址显示/posts/1
但是您不想再显示帖子列表,您只想显示该帖子。代码就是这样的。
this.resource('posts', function() {
this.route('view',{ path: ':id' });
}
<h1> Posts </h1>
{{outlet}}
... show all posts here ...
... show selected post here ...
PS只有FooIndexRoute
的{{1}}没有与FooRoute
相关联的模型,这就是afterModel
没有任何内容的原因。