0

私は次のモデルを持っています(この質問のために簡略化されています):

App.Manager = DS.Model.extend({
  name: DS.attr('string'),

  teamMembers: DS.hasMany('App.Employee')
});

このモデルがロードされると(たとえば、でApp.Manager.find(1))、teamMembers配列を使用してサーバーから返されます。

[10, 11, 12]

私のビューにはこれらのチームメンバーからのデータが必要なので、EmberfindMany()は期待どおりに自動的にリクエストをロードします。私が遭遇している問題は、従業員#11が存在しないことです。findMany()サーバーは、従業員10と12だけで要求に応答します。

{
  "employees": [
    {
      "id":   10,
      "name": "John Doe"
    },

    {
      "id":   12,
      "name": "Jane Doe"
    }
}

しかし、Ember-Dataは、従業員11のデータが返されなかったとしても、従業員11の空の(そして履行された)約束を維持しているようです。したがって、ビューがレンダリングされると、3行(各従業員に1つ)のテーブルが表示され、それらの行の1つは完全に空白になります(レコードが空であるため)。

レコードの状態を確認します。

{
    isLoaded:  true,
    isDirty:   false,
    isSaving:  false,
    isDeleted: false,
    isError:   false,
    isNew:     false,
    isValid:   true
}

したがって、必要なすべてのプロパティが空であるかどうかを確認せずに、この空のレコードをビューから除外する方法がわかりません。サーバーが応答して、残り火にこの約束を果たさないように指示する方法はありますか?データが返されない場合を認識するようにemberを構成する方法はありますか?


編集:理想的には、サーバーは存在しない従業員のIDを返さないことを理解しています。しかし、実際には、データの信頼性が低い場合や、保守が不十分な場合があります。従業員11が不正確なデータで戻ってきた場合、問題はデータやサービスにあり、Emberにはないことに同意します。ただし、この場合、従業員11は不正確なデータを返しておらず、データまったく返していません。この場合、残り火は少なくとも、レコードが空/無効/見つからないことを示すフラグ(つまり、isValid:false)を設定する必要があるように思われます。フラットにしない場合は、空のレコードへの参照を完全に破棄します。

編集2:これがGithubの問題です

4

1 に答える 1

1

Ember-data がこのシナリオに魔法を提供する必要があるかどうかを判断するのは困難です。リレーションシップに ID を含めることで、ember-data にその ID が存在することを効果的に伝えることができます。

REST アダプター (サーバーからデータを要求する) は、シリアライザー (応答データをモデルに変換する) とは別であるため、要求されたすべてのデータが実際に返されたかどうかを知ることは困難です。アダプターをシリアライザーに密結合することを気にしない場合は、サーバーが期待していたすべてのものを提供したことを確認できる場合があります。

回避策:

従業員モデルに検証プロパティを追加して、疑似状態の一種として使用します。これはデフォルトで false または null に設定され、API が返すすべてのレコードがそれを上書きする必要があります。かなりハック。幸いなことに、これと同じ概念は、従業員の名前などの既存のプロパティを使用して実現できます。

if (App.Employee.find(11).get('name') != null) { dance('thriller'); }

上記の概念を標準の検証要件と見なす場合は、モデルまたはシリアライザーのいずれかにそれを実装することを選択できます。

于 2013-02-22T04:33:31.477 に答える