Ember.js 子路由(或资源)如何访问父资源;模型钩子中的模型?

Ember.js 子路由(或资源)如何访问父资源;模型钩子中的模型?,ember.js,ember-router,Ember.js,Ember Router,似乎在嵌套路由的情况下,在调用任何setupController钩子之前,都会调用每个路由的model钩子。那么,子路由如何安全地访问父路由的模型呢 在我的例子中,模型实际上并不是持久化实体。它们都是基于参数在模型钩子中生成的。所以我不认为一个Parent.find()/ajax/promise看起来是一个不错的选择。理想情况下,应该可以通过ParentController访问父模型,不是吗?或者这种方法不符合最佳实践 App.Router.map(function() { this.res

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

在我的例子中,模型实际上并不是持久化实体。它们都是基于参数在模型钩子中生成的。所以我不认为一个
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
  }
});
模特儿

我怎么会错过呢

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

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,获取父路由信息的另一种方法是使用

currentRouteName
currentUrl
这样的方法对显示很有帮助,不过最好在有更好的选项时避免花哨的字符串解析。您还可以使用路由器服务的
转换到
,以更改来自组件的路由

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

从'@ember/service'导入{injectasservice}

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

当你能回答自己的问题时,一定会喜欢的。谢谢@doublea。我想进一步澄清,您传递给
modelFor
的参数是您想要其模型的父路由的名称。例如,
user
user.posts
,等等。非常感谢@steve.hanson,我用的是上驼峰字母,而不是点符号!!在我的例子中,
modelFor
方法只有在我指定了我想要的模型的路由时才起作用,比如
let account=this.modelFor('admin.accounts.edit')