Ember.js如何在beforeModel / afterModel挂钩之前获取模型并将其传递给控制器​​?

时间:2014-10-15 14:25:59

标签: ember.js

我在使用models访问的路由的controller内获取{{link-to}}时遇到问题 根据我的理解(在阅读http://emberjs.com/guides/routing/asynchronous-routing/之后),当从model访问路由时,route的{​​{1}}挂钩不会被调用。 {{link-to 'route' model}}会直接传递给model。这是Ember确保不会不必要地调用controller的方式。

例如,如果我转到AJAX,我需要将{{link-to 'post-review' post}}以上的post model传递给PostReviewController

App.Router.map(function () {
 ...
 this.resource('post-review' , {path: '/post-review/:id'});
 ...
});

PostReviewRoute = Ember.Route.extend({

  //method doesn't get called
  model: function(params){
    return Em.RSVP.hash({
        post: this.store.find('post', params.id),
        reviewTypes: this.store.find('reviewType')
    });
  }
});

ReviewType是与Post无关的模型,因此我可以使用post.reviewType直接访问它。 post有多个reviews。评论有reviewType。但我必须在组合框中显示所有reviewTypes

无论如何,model挂钩未被调用,我无法从this.get('reviewTypes')访问PostReviewController。我了解beforeModelafterModel个钩子用于此目的:当models从{controller访问时,将route传递给link-to 1}}而不是直接来自浏览器URL。文档没有说明如何做到这一点!如果你知道怎么做,请赐教!

谢谢!

1 个答案:

答案 0 :(得分:2)

setupController救援,在您的路线中使用setupController挂钩来设置reviewTypes,如下所示:

PostReviewRoute = Ember.Route.extend({
  setupController: function(controller, model){
   var postId = model.get('id');
   this._super.apply(this, arguments);
   this.store.find('reviewType').then((records)=> {
     controller.set('reviewTypes', records);
   });
   this.store.find('post', postId).then(....)
  },
// your code
});

您现在应该可以致电this.get('reviewTypes')

让我知道这是否适合你。