当使用动态段id时,Ember参数和模型在afterModel挂钩中为零

时间:2014-07-17 04:21:48

标签: ember.js

我有一个如下所示的路由器:

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挂钩不应该记录模型吗?

1 个答案:

答案 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没有任何内容的原因。