私は最近、ExtJS アソシエーションで非常に苦痛な学習曲線を経験し、いくつかの有用な記事と私自身の落とし穴に出くわしました。同じように悩んでいる方に向けてまとめました。
ExtJS の HasMany アソシエーションのルール
- プロキシは、非常に正当な理由がない限り、ストアではなく常にモデルに配置してください [1]。
- hasMany リレーションシップで子モデルを使用する場合は、常に子モデルを必要とします。[2]
- 子を自由にロードしたい場合は、常にforeignKeyを使用してください
- 親と同じ応答で子を返す場合は、常に associationKey を使用します。
- 必要に応じて、foreignKey と associationKey の両方を使用できます
- 常に hasMany 関係に名前を付けます
- hasMany リレーションシップでは常に完全修飾モデル名を使用する
- リーダー ルートに意味のある名前を付けることを検討してください (「データ」以外)。
- 子モデルは、hasMany が機能するために属している関係を必要としません。
[1] ストアはそのモデルのプロキシを継承し、いつでもオーバーライドできます
[2] 簡単にし、循環参照の可能性を回避するために、app.js でそれらを要求できます
http://extjs-tutorials.blogspot.com/2012/05/extjs-hasmany-relationships-rules.html
ExtJS の HasOne および BelongsTo アソシエーションのルール
- よほどの理由がない限り、プロキシをモデルに入れます。
- 常に完全修飾モデル名を使用する
- 常に getterName を設定する
- setterName を常に設定する
- 外部オブジェクトがこのオブジェクトと同じ応答で返される場合は、常に associationKey を設定します。
- 外部オブジェクトを自由にロードしたい場合は、常にforeignKeyを設定してください
- instanceName を短いものに変更することを検討してください
- ゲッターは、外部オブジェクトがロードされているかどうかによって異なる動作をします。読み込まれている場合は、異物が返されます。それ以外の場合は、コールバックを渡して取得する必要があります。
- この関連付けをオーバーライドする場合は、name プロパティを設定する必要があります。
- hasMany が機能するために属している関係は必要ありません
- 親モデルの id フィールドが「id」でない場合、primaryKey プロパティを設定します
- 時には、begsTo アソシエーションに uses または requires を使用する必要があります。ただし、循環参照には注意してください。
- setter() 関数を呼び出しても、インスタンスが設定されていないようです。setter() を呼び出す場合は、object.belongsToInstance = obj を設定します。
http://extjs-tutorials.blogspot.com/2012/05/extjs-belongsto-association-rules.html
その他
- データをグリッドに適用する場合は、新しいストアを使用してグリッドで reconfigure() を呼び出すようにしてください
- 「foreignKey」プロパティはローカル フィルターとして ExtJS ストアに適用されます。データがネットワーク経由でロードされているのにグリッドに表示されていない場合は、モデルにフィールドとして定義されたforeignKey値があることを確認してください。そうしないと、ローカル フィルターによってデータが静かに除外されます。これが当てはまるかどうかをテストするには、ストアの「ロード」イベントにフックして store.clearFilters() を呼び出し、データが表示されるかどうかを確認します。