【问题标题】:How can a child route (or resource) access a parent resource's model from within the model hook?子路由(或资源)如何从模型挂钩中访问父资源的模型?
【发布时间】:2013-09-11 05:13:20
【问题描述】:

似乎在嵌套路由的情况下,每个路由的 model 挂钩在调用任何 setupController 挂钩之前被调用。那么子路由如何安全访问父模型呢?

就我而言,模型实际上并不是持久化实体。它们都是基于参数在模型挂钩中生成的。所以我不认为Parent.find() / ajax / promise 似乎是要走的路。理想情况下,父模型应该可以通过ParentController 访问,不是吗?还是这种方法不符合最佳实践?

App.Router.map(function() {
  this.resource("parent", { path: "parent/:name" }, function() {
    this.route('child');
  });
});

App.ParentRoute = Ember.Route.extend({
  model: function(params) {
    // build a model here, based on params.
    // no asynch stuff happening, should be good to go.
    return { lastName: params.name }
  },

  setupController(controller, model) {
    controller.set('model', model);
  }
});

App.ChildRoute = Ember.Route.extend({
  model: function(params) {
    parentModel = this.controllerFor('parent').get('model');
    return {lastName: parentModel.get('name') + 'son' };

    // parent Model is null
    // need the parent model HERE, 
    // but I can't get it through the controller yet
    // as setupController in the parent route hasn't been called yet
  }
});

【问题讨论】:

    标签: ember.js ember-router


    【解决方案1】:

    模型

    我怎么会错过呢?

    App.ChildRoute = Ember.Route.extend({
      model: function(params) {
        parentModel = this.modelFor('parent');
        return {lastName: parentModel.get('name') + 'son' };
      }
    });
    

    【讨论】:

    • 当你能回答自己的问题时一定会喜欢它。
    • 谢谢@doublea。我想进一步澄清您传递给modelFor 的参数是您想要其模型的父路由的名称。例如。 useruser.posts 等以及here are the docs
    • 非常感谢@steve.hanson,我是用大写驼峰写的,而不是点符号!!
    • 就我而言,modelFor 方法仅在我指定了我想要的模型的 route 时才有效,例如 let account = this.modelFor('admin.accounts.edit');
    【解决方案2】:

    doublea 的回答仍然适用于 Ember 3.x,只是对路由的样板语法进行了一些细微的更改。 get 也不再需要,但将其留在那里并不会造成任何伤害。这是 3.x 的语法:

    import Route from '@ember/routing/route';
    
    export default Route.extend({
        model(params) {
           parentModel = this.modelFor('parent');
           return {lastName: parentModel.name + 'son' };
        }
    });
    

    对于 Ember 2.16 到至少所有 Ember 3,获取父路由信息的另一种方法是使用 RouterService

    currentRouteNamecurrentUrl 之类的方法有助于显示,但最好在有更好的选项时避免花哨的字符串解析。您还可以使用路由器服务的transitionTo 来更改组件的路由。

    Router Service 可以这样使用:

    从“@ember/service”导入{inject as service};

    export default Component.extend({
        router: service(),
        actions: {
          clickedAThing() {
            this.router.transitionTo('some.route')
          }
        }
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 2018-01-16
      • 1970-01-01
      • 2013-01-31
      • 2015-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多