如何在ember数据中为同一模型设置不同的数据?

时间:2013-08-16 01:37:46

标签: ember.js ember-data

在我的应用中,有两种型号:App.CompanyApp.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将从商店中检索它认为的相同数据;但它不会得到更新的合同。

我可以想出两种方法来解决这个问题:

  1. setupController的{​​{1}}挂钩中,设置MonthRoute上的内容。

  2. 删除公司和合同上的ContractsController,并将其作为id发送到JSON有效内容中。

  3. 实现这一目标的正确/惯用方法是什么?

1 个答案:

答案 0 :(得分:1)

  

如何在ember数据中为同一模型设置不同的数据?

您无法在同一模型,ember或任何其他MVC框架中设置不同的数据。

  

实现这一目标的正确/惯用方法是什么?

当您遇到此类问题时,表明您需要退后一步并考虑以不同方式对域进行建模。

当我们想到一个ember 模型时,通常意味着存在服务器端的东西,但它不一定是那样。在这种情况下,您有一个模型,它实际上不需要存在于服务器上,它只是表示日期范围的一种方式。唯一的服务器端模型是公司和合同。因此,不是查询服务器一个月并且侧载公司/合同数据,而是直接查询公司或合同,可能包括查询参数,以便服务器仅返回相关合同及其关联公司,这将更加惯用。

现在,当用户在您的应用程序中移动时,您可以预期随着时间的推移,大多数甚至所有公司和合同都会在内存中。事实上,您甚至可能决定在应用程序启动时加载它们。在任何情况下,用于限制通过api加载的内容的查询与实际通过UI显示正确的公司无关。这需要通过过滤器客户端完成。