在我的应用中,有两种型号:App.Company
和App.Contract
。一家公司有很多合同。我正在使用Ember数据。
我想显示所有在某个月内开始合约的公司。例如,/Jan-2013
仅显示那些从2013年1月开始签订合同的公司。我还希望仅显示相关合同。
所以,我有一个Month
资源:
App.Router.map(function() {
this.resource('month', { path: '/:month_id' });
});
每家公司和合同都有id
。我的问题是,设置控制器的最佳方法是什么?
目前我每个月只从服务器返回必要的数据。例如,2013年4月将返回
{
month: {
id: "Apr-2013",
company_ids: [5, 23, 905, 4, 59]
},
companies: [
{
id: 5,
name: "Acme, Inc.",
contract_ids: [94, 84, 20, 1]
},
...
],
contracts: [
{
id: 94,
date: "2013-04-02",
new_monthly_fee: 50182
},
...
]
}
如果我以标准方式构建事物,我遇到了问题。比如说id 5的公司出现在2013年4月和2013年5月。但是这家公司在两个月内也有不同的contract_ids
数组。如果我第一次访问四月,当我访问May时,Ember将从商店中检索它认为的相同数据;但它不会得到更新的合同。
我可以想出两种方法来解决这个问题:
在setupController
的{{1}}挂钩中,设置MonthRoute
上的内容。
删除公司和合同上的ContractsController
,并将其作为id
发送到JSON有效内容中。
实现这一目标的正确/惯用方法是什么?
答案 0 :(得分:1)
如何在ember数据中为同一模型设置不同的数据?
您无法在同一模型,ember或任何其他MVC框架中设置不同的数据。
实现这一目标的正确/惯用方法是什么?
当您遇到此类问题时,表明您需要退后一步并考虑以不同方式对域进行建模。
当我们想到一个ember 模型时,通常意味着存在服务器端的东西,但它不一定是那样。在这种情况下,您有一个月模型,它实际上不需要存在于服务器上,它只是表示日期范围的一种方式。唯一的服务器端模型是公司和合同。因此,不是查询服务器一个月并且侧载公司/合同数据,而是直接查询公司或合同,可能包括查询参数,以便服务器仅返回相关合同及其关联公司,这将更加惯用。
现在,当用户在您的应用程序中移动时,您可以预期随着时间的推移,大多数甚至所有公司和合同都会在内存中。事实上,您甚至可能决定在应用程序启动时加载它们。在任何情况下,用于限制通过api加载的内容的查询与实际通过UI显示正确的公司无关。这需要通过过滤器客户端完成。