Ember.js afterModel hook触发两个相同的请求

时间:2014-04-08 17:45:56

标签: javascript ember.js ember-data

在我的应用程序中,我需要在访问root时,它会重定向到最新模型的视图,在这种情况下,它始终是集合中的firstObject。

App.Router.map(function() {
    this.resource('threads', { path: '/' }, function() {
        this.route('view', { path: ':thread_id' });
    });
});

App.ThreadsRoute = Ember.Route.extend({
  model: function() {
    return this.store.find('thread');
  },
  afterModel: function(threads) {
    this.transitionTo('threads.view', threads.get('firstObject'));
  }
});

这没有问题,但是我直接转到根网址或视图,发出了两个相同的/threads请求。一旦我对afterModel部分发表评论,重定向显然不再起作用,但请求又回到了1。

很乐意接受任何帮助!

2 个答案:

答案 0 :(得分:3)

由于Threads / View是嵌套路由,因此也会在View路径上调用ThreadsRoute。

我认为你应该只调用ThreadsRoute - > ThreadsIndexRoute或单独的模型和afterModel以这种方式挂钩:

(未经过测试的代码)

App.ThreadsRoute = Ember.Route.extend({
  model: function() {
    // console.log('in model);
    return this.store.find('thread');
  }
});

App.ThreadsIndexRoute = Ember.Route.extend({
  afterModel: function(threads) {
   // console.log('in afterModel);
    this.transitionTo('threads.view', threads.get('firstObject'));
  }
});

答案 1 :(得分:2)

您的示例与此示例相同:

App.Router.map(function() {
    this.resource('threads', { path: '/' }, function() {
        this.route('view', { path: ':thread_id' });
    });
});

App.ThreadsRoute = Ember.Route.extend({
  model: function() {
    return this.store.find('thread');
  }
});

App.ThreadsIndexRoute = Ember.Route.extend({
  model: function() {
    return this.store.find('thread');
  }
});

如果您在访问'/'时检查了检查员您所在的路线,您会发现自己在 threads.index,依次转换为每个人,这就是为什么你会看到要求找到两次的电话。 您可以通过仅在ThreadsIndexRoute中使用模型挂钩来解决此问题(例如,将您的ThreadsRoute重命名为ThreadsIndexRoute