0

在我的应用程序中有两个模型: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在两个月内也有不同的数组。如果我第一次访问 April,当我访问 May 时,Ember 会从商店中检索它认为相同的数据;但它不会得到更新的合同。

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

  1. setupController钩子里MonthRoute,设置上的内容ContractsController

  2. 删除id公司和合同上的 s,并将它们作为embedded: alwaysJSON 有效负载发送。

实现此目的的正确/惯用方法是什么?

4

1 回答 1

1

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

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

实现此目的的正确/惯用方法是什么?

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

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

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

于 2013-08-16T04:41:25.593 回答