【问题标题】:Ember.js how to get a model inside beforeModel/afterModel hooks and pass it to the controller?Ember.js 如何在 beforeModel/afterModel 挂钩中获取模型并将其传递给控制器​​?
【发布时间】:2014-10-15 14:25:58
【问题描述】:

在使用{{link-to}} 访问的路由的controller 中获取models 时遇到问题 据我了解(在阅读http://emberjs.com/guides/routing/asynchronous-routing/ 之后),当从{{link-to 'route' model}} 访问路由时,不会调用routemodel 钩子。 model 直接传递给controller。这是 Ember 确保不会不必要地调用 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 钩子不会被调用,我无法从PostReviewController 访问this.get('reviewTypes')。我知道beforeModelafterModel 挂钩用于此目的:当route 是从link-to 而不是直接从浏览器URL 访问时,将额外的models 传递给controller。该文档没有显示您如何做到这一点!知道方法的请赐教!

谢谢!

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    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')了。

    如果这对你有用,请告诉我。

    【讨论】:

    • Oups 一件事让我忘记了,我正在使用 esNext,如果你不是,请将 (records)=>... 替换为 function(records)... ^^
    • 有效!但是现在我如何使用 this.get('reviewTypes') 访问控制器内的 post 和 reviewTypes 表单有点令人困惑。但是我无法访问该帖子; this.get('post') 未定义。少了点什么。。
    • 已编辑,附带说明,this.resource('post-review' , {path: '/post-review/:id'}); 应为 this.resource('post-review' , {path: '/post-review/:post_id'});
    • 非常感谢您,帕西!它让我发疯了! :) 顺便说一句,我猜 model: function(){} 即使它在页面刷新时被调用(或者我直接在浏览器中输入 URL)也没有意义了..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    相关资源
    最近更新 更多