11

似乎在嵌套路由的情况下,每个路由的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
  }
});
4

2 回答 2

28

模型为

我怎么会错过呢?

App.ChildRoute = Ember.Route.extend({
  model: function(params) {
    parentModel = this.modelFor('parent');
    return {lastName: parentModel.get('name') + 'son' };
  }
});
于 2013-09-07T02:30:30.903 回答
1

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

currentRouteName和之类的方法currentUrl对显示很有帮助,尽管当有更好的选项时最好避免花哨的字符串解析。您还可以使用路由器服务transitionTo来更改组件的路由。

路由器服务可以这样使用:

从“@ember/service”导入{作为服务注入};

export default Component.extend({
    router: service(),
    actions: {
      clickedAThing() {
        this.router.transitionTo('some.route')
      }
    }
})
于 2018-08-19T20:51:05.187 回答