Ember.js Ember数据父/子模型和json

Ember.js Ember数据父/子模型和json,ember.js,ember-data,Ember.js,Ember Data,我想自己一次完整地记录(并保持永久记录!)父母和孩子之间的关系和理想的json结构,以及路由和控制器的基本示例 当我(希望)得到答案和评论时,我将更新问题以反映最佳实践 所以,我有我的余烬模型: App.Customer = DS.Model.extend({ name: DS.attr('string' ), orders: DS.hasMany("order") }); App.Order = DS.Model.extend({ carrier: DS.attr

我想自己一次完整地记录(并保持永久记录!)父母和孩子之间的关系和理想的json结构,以及路由和控制器的基本示例

当我(希望)得到答案和评论时,我将更新问题以反映最佳实践

所以,我有我的余烬模型:

App.Customer  = DS.Model.extend({
    name: DS.attr('string' ),
    orders: DS.hasMany("order")
});

App.Order  = DS.Model.extend({
    carrier: DS.attr('string' ),
    customer: DS.belongsTo("customer")
    orderlines: DS.hasMany("orderline")

});

App.Orderline  = DS.Model.extend({
    order: DS.belongsTo("order"),
    item: DS.belongsTo("item"),
    price: DS.attr('number'),
    qty: DS.attr('number'),
});

App.Item  = DS.Model.extend({
    name: DS.attr('string'),
    orderlines: DS.hasMany("orderline")
});
问题1:这些模型定义正确吗

我可以采用几种方法查看这些数据:

  • 客户选项卡|订单选项卡|订单行选项卡
  • 客户页面->订单页面->订单行页面
  • 树景
  • 有人能推荐其他可以显示这种层次数据的JS小部件吗
问题2:

每个路由器/控制器都需要什么

我有选项2)显示客户,但当我点击客户的订单链接时,我得到了所有订单。可能是我的json错了。。或者更可能的是,我不知道如何显示所选客户的所有订单。或两者兼而有之:(

我目前有:

{"customers":[
  {"name":"foobar inc","id":"0x181","orders":["0x386","0x3a4"]},
  {"name":"barfoo ltd","id":"0x182","orders":["0x3de","0x3fd"]} ],   
 "orders":[
   {"carrier":"Standard Mail","id":"0x386","customer_id":"0x181"},
   {"carrier":"FlyByNight Courier","id":"0x3a4","customer_id":"0x181"},
   {"carrier":"Standard Mail","id":"0x3de","customer_id":"0x182"},
   {"carrier":"FlyByNight Courier","id":"0x3fd","customer_id":"0x182"} ]}
问题3:这是否正确?(我可以将json转换成任何格式,因此最好创建最适合ember数据的json结构)

问题4:此时我是否应该包括相关数据(因此所有客户、所有订单、所有订单行)?还是最好不包括子数据,而是从服务器按需获取这些数据


我暂时不谈了-希望我能很快开始理解嵌套数据!谢谢。

问题1这些模型定义对我来说很好

问题2例如,您可能希望在
/customers
页面上混合使用选项1和选项2。选项卡可以让您查看每个模型的完整列表,但可以按层次进行深入查看。您需要的确切路由取决于您希望在ap中提供的确切URLp对应于要显示的屏幕/视图

假设您需要这些URL/屏幕

/customers
-所有客户的列表

/customers/1
-有关客户的详细信息#1

/customers/1/订单
-客户的所有订单#1

/customers/1/orders/1
-订单1的详细信息(包括
订单行
s)

那么你的路线是:

App.Router.map(function() {
    this.resource('customers');
    this.resource('customer', { path: '/customers/:customer_id' }, function(){
        this.resource('orders');
        this.resource('order', { path: '/orders/:order_id'});
    });
});
问题3是的,JSON看起来是正确的

问题4这取决于你的应用程序的需要。你可能不想在一个请求(客户->订单->订单行->项目)中包含整个数据树。你可能想随着用户进入一棵树而逐步加载内容

例如,您首先希望加载客户列表,然后当用户单击某个客户时,您希望发出请求以获取该客户的所有订单,依此类推

下面是一个JSBin,展示了总体思路:

请注意,
有许多
关系是用
{async:true}
定义的。这允许根据需要查找它们,而不是用父模型加载它们

如果切换到
重新适应程序
,当它尝试加载客户订单列表时,会发出如下请求:

/orders?id[]=0x3de&id[]=0x3fd

[更新]:回应评论

因此,对于您请求的url结构:>>客户列表>->客户详细信息>->订单列表>->订单详细信息>->订单行列表>->订单行详细信息

您与JSBin的关系非常密切。让您感到困惑的是模板嵌套的工作方式

如果存在
/orders/xxx
/orders/xxx/*
匹配的任何和所有路由,都会呈现
'order'
模板。如果路由的其他部分,如
/orderlines
等,则这些模板会呈现到
'order'
模板中。但是,由于
'order'
模板不存在我们有一个
{outlet}
模板,
'orderlines'
没有任何东西可以呈现到其中

这里有一个稍微修改过的JSBin:

唯一的变化是将
{{outlet}
添加到
'order'
模板的底部

现在,呈现下面的
订单行
或主订单详细信息中的其他内容可能不是您想要的。很可能您希望订单行替换其他订单信息。在这种情况下,您可以将
'order'
模板重命名为
'order/index'
。(您还可以从
OrderController
中删除
OrderRoute
needs

另一个JSBin,模板重命名为:

那么,这里发生了什么? 以
订单
模型为例,当您访问
/orders
路线以及应用于集合的任何其他路线(
/orders/new
/orders/some\u custom\u batch\u thing
)时,如果主
'orders'
模板存在,则呈现该模板,然后将子路径模板呈现为
'orders'
。如果
'orders'
模板不存在,则子路径模板呈现为
{outlet}
,即直接位于链的上游。
/orders
路由是一种特殊情况,因为它的子模板被隐式地假定为
orders/index
。类似地,对于
/orders/xxx
和应用于单个
订单的任何其他路由,首先呈现
'Order'
模板(如果存在),则子路径模板被渲染为“<代码>”顺序,或进入最直接的PAR。