0

私のアプリには と の 2 つのモデルがApp.CompanyありApp.Contractます。会社にはたくさんの契約があります。私はEmberデータを使用しています。

特定の月に開始する契約があるすべての会社を表示したい。たとえば、/Jan-20132013 年 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は 2 か月間で異なる配列を持っています。最初に 4 月にアクセスすると、5 月にアクセスすると、Ember はストアから同じデータであると判断したものを取得します。ただし、更新された契約は取得されません。

これを解決するには、次の 2 つの方法が考えられます。

  1. setupControllerフックで、MonthRouteにコンテンツを設定しますContractsController

  2. id会社と契約の両方の を削除embedded: alwaysし、JSON ペイロードのように送信します。

これを達成するための正しい/慣用的な方法は何ですか?

4

1 に答える 1

1

emberデータで同じモデルに異なるデータを設定するにはどうすればよいですか?

ember またはその他の MVC フレームワークでは、同じモデルに異なるデータを設定することはできません。

これを達成するための正しい/慣用的な方法は何ですか?

この種の問題に遭遇した場合は、一歩下がって別の方法でドメインをモデル化することを検討する必要があることを示しています。

通常、エンバーモデルについて考えるとき、それはサーバー側に存在するものを意味しますが、そうである必要はありません。この場合、実際にはサーバー上に存在する必要のない月モデルを取得しています。これは、日付範囲を表す方法にすぎません。サーバー側のモデルは Company と Contract のみです。そのため、サーバーに 1 か月クエリを実行して会社/契約データをサイドローディングする代わりに、サーバーが関連する契約とそれに関連する会社だけを返すようにクエリ パラメーターを含めて、会社または契約を直接クエリする方が慣用的です。

ユーザーがアプリ内を移動すると、時間の経過とともにほとんどの会社や契約がメモリに保存されることが予想されます。実際、アプリの起動時にすべてをロードすることもできます。いずれにせよ、API を介して読み込まれるものを制限するために使用するクエリは、UI を介して適切な企業を実際に表示することとは何の関係もありません。これは、フィルターを介してクライアント側で行う必要があります。

于 2013-08-16T04:41:25.593 に答える