如何使用 ember.js 访问嵌套索引路由中的父模型?

Posted

技术标签:

【中文标题】如何使用 ember.js 访问嵌套索引路由中的父模型?【英文标题】:How to access a parent model within a nested index route using ember.js? 【发布时间】:2013-01-20 11:26:20 【问题描述】:

我有以下路线结构

App.Router.map(function(match) 
    this.route("days",  path: "/" );
    this.resource("day",  path: "/:day_id" , function() 
        this.resource("appointment",  path: "/appointment" , function() 
            this.route("edit",  path: "/edit" );
        );
    );
);

当我在 AppointmentIndexRoute 中时,我正在寻找一种方法来使用日(父)模型中的某个元日创建新模型,但由于日模型尚不知道此约会,我不确定如何将它们关联起来,直到创建约会/并触发提交。

任何帮助将不胜感激

【问题讨论】:

【参考方案1】:

AppointmentIndexRoute 的模型挂钩中,您可以使用modelFor('day') 来访问父模型。例如:

App.AppointmentIndexRoute = Ember.Route.extend(
  model: function(params) 
    day = this.modelFor("day");
    ...
  
);

另一个例子在这里:emberjs 1.0.0pre4 how do you pass a context object to a resource "...Index" route?

【讨论】:

我喜欢它这么简单 - 感谢您的快速回复! 请注意,现在(Ember 2.0)您需要使用路由的完整路径,因此它将是this.modelFor('days.day') @andorov 我错过了什么吗?看起来日路线没有嵌套在日之下。他们是兄弟姐妹。 是的,你是对的。但是我相信 pre-2.0 会让你摆脱非绝对模型调用【参考方案2】:

如果我不使用 ember 数据怎么办?如何在

之类的路线中获取父 ID
  this.resource('workspace',function () 
    this.resource('workflow', path: '/:workspace_id/workflow', function () 
      this.route('show', path: '/:workflow_id');
    );
  );

此代码不起作用:

App.WorkflowShowRoute = Em.Route.extend(
  model: function(params) 
      var ws  = this.modelFor('workspace');  //ws is undefined
      return this.store.find('workflow', params.id, ws.id);
  
);

编辑: 我找到了一种解决方法,它并不理想,但完全按照我想要的方式工作。

  this.resource('workspace',function () 
    this.route('new');
    this.route('show', path: '/:workspace_id');
    //workflow routes
    this.resource('workflow', path: '/', function () 
      this.route('new', path:'/:workspace_id/workflow/new');
      this.route('show', path: '/:workspace_id/workflow/:workflow_id');
    );
  );

在我的工作流程路线中,我可以按照我对 params 属性的期望访问 workspace_id:

App.WorkflowShowRoute = Em.Route.extend(
  model: function(params) 
      return this.store.find('workflow', params.workflow_id, params.workspace_id);
  
);

最后,这是我在workspace.show route helper中的链接:

#each workflow in workflows
  <li>
    #link-to 'workflow.show' this.id workflow.idworkflow.name/link-to
  </li>
/each

【讨论】:

您将数据存储在哪里(如果您不使用 ember-data 存储)?你有本地的身份地图或类似的东西吗? 我使用eviltrout.com/2013/03/23/ember-without-data.htmleviltrout.com/2013/03/23/ember-without-data.html 介绍的技术创建了自己的商店

以上是关于如何使用 ember.js 访问嵌套索引路由中的父模型?的主要内容,如果未能解决你的问题,请参考以下文章

Ember JS 过渡到嵌套路由,其中​​所有路由都是视图中的动态段

Ember.js:从嵌套路由调用 ApplicationRoute 的操作

Ember.js 集合迭代中的位置索引

为啥没有调用我的 ember.js 路由模型?

Ember.js 如何获取需要嵌套的控制器名称

Ember.js 路由器:如何动画状态转换