在 Ember 中创建依赖于另一个对象的新数据对象时,您如何传递它?

When creating a new data object in Ember that relies on another object how do you pass it along?

我在一个可以看到特定客户的页面上,我的 router.js 的一部分是:

this.route('customers');
this.route('customer', {path: "customers/:customer_id"});
this.route('customer.order.create', { path: "customers/:customer_id/order/create" });

customer.order.create 需要在我的主视图中加载,因此没有嵌套。一个订单 'has a' 客户。

我已经将我的 /customer/order/create 控制器设置为

needs: "customer"

我想在我的 /customer/order/create.hbs 模板中访问客户,如下所示:

<h3>New Order for {{controllers.customer.name}}</h3>

当我最终创建订单时,我还想设置 newOrder.customer = customer

customer.hbs 这样的链接

<div>
  {{#link-to 'customer.order.create' model}}Create Order{{/link-to}}
</div>

目前 {{controllers.customer.name}} 什么都没有呈现,我在 order/create 路线中缺少哪一块拼图才能到达客户?

或者更笼统地说,当我在 /parentObject/parent_id/childObject/create 类型的场景中有一个属于我的子对象的父对象时,我需要什么 route/controller/etc 代码。

您应该能够从商店吸引顾客。试试下面的代码:

路线:

export default Ember.Route.extend({
  model: function(params) {
    return Ember.RSVP.hash({
      customer: this.store.find('customer', params.customer_id)
    });
  }
});

控制器:

export default Ember.Controller.extend({
  customer: Ember.computed.alias('model.customer')
});

它应该可以在您的模板中作为 customer 直接访问,如下所示:

<h3>New order for {{customer.name}}</h3>

有很多地方需要修正:

1) {{controllers.customer}} 是控制器对象,{{controllers.customer.name}} 是名称 属性。我想你想要 {{controllers.customer.model.name}}.

2) “..newOrder.customer = 客户..”应该是

 newOrder.set('customer', this.get('controllers.customer.model'));

3) 你的 customer.order.create 路由 model 钩子不应该是空的,因为你使用的是动态段 customer_id:

//route
model: function(params) {
  return this.find('customer', params.customer_id);
}

4) 您的路线未嵌套,因此如果您的 customer 路线未激活,{{controllers.customer.model.name}} 将为空。所以你应该使用: {{model.name}} 而不是 {{controllers.customer.model.name}}

当你点击link时,你直接传递了模型,并且model钩子没有被触发,所以一切看起来都很好。当您直接访问 url 时,会触发 model 挂钩。如果它是空的,你什么也看不到。

一般概念:是依赖注入的概念,你可以看这里:http://guides.emberjs.com/v1.12.0/understanding-ember/dependency-injection-and-service-lookup/

我将 needs: "customer" 更改为 needs: ["customer"],然后在我的模板中使用了 {{model.name}}。似乎需要一个字符串数组而不仅仅是一个字符串,在我修复 Ember 之后比较其余的而不需要创建 /customers/order/create.js 路由。

如果您不想处理所有问题,请参阅 Artych 的回答以获得更完整的答案。