序章
Ext.data.Model
ExtJSのクラスでアプリケーション設計の問題に直面しています。ここでは、私のアイデアを非常に一般的なオンライン ストアのシナリオに展開しようとします。私の考えや結論についてコメントをいただければ幸いです。
モデル
「すべての顧客が複数の製品を注文できる」という事実を ExtJS にマッピングするとします。素の言葉から、関係する次の 3 つのモデルを識別できます: Customer
、Order
、およびProduct
。このOrder
場合の は、Customer
s と
Product
s を接続するものです。
協会
ExtJS では、およびクラス(Customer)1-n(Order)1-n(Product)
を使用してこの関係を実際に指定できることがわかりました。しかし、これは人が望むものですか?が常に に属していることを望みますか? s とはまったく関係のない s のリストが必要な場合はどうすればよいでしょうか。Ext.data.HasManyAssociation
Ext.data.BelongsToAssociation
Product
Order
Product
Order
店舗
これは、より ExtJS 固有のものになります。ExtJS では、Ext.data.Store
すべてのデータを保持する s があります。私にとって、データを整理する自然な方法Ext.data.Store
は、モデルごとに forを持つことです。
CustomerStore
OrderStore
ProductStore
Ext.grid.Panel
3 つの s を並べて配置することを検討してください。店舗ごとに1つ。1 つのグリッドで顧客を選択すると、その注文が 2 番目のグリッドに自動的に表示されます。2 番目のグリッドで注文を選択すると、関連する製品が 3 番目のグリッドに表示されます。
これはあなたにとって自然に聞こえますか?そうでない場合は、コメントしてください!
すべてをまとめる
したがって、ここでまとめる必要があるのは次の 3 つです。
- モデルとその
- 関連 (
hasMany
、belongsTo
) および - データ
Store
_
モデル-モデル関係の片側からのみ関連付けを定義することは可能ですか? たとえば、Order
hasMany
Product
s を指定して an を除外することはProduct
belongsTo
できOrder
ますか? aProduct
は実際には複数の に属することができるためOrder
です。したがって、Product
モデルはhasMany
Order
以下のように指定します。
ExtJS のモデルは次のとおりです。
お客様
Ext.define('Customer', {
extend : 'Ext.data.Model',
requires : [
'Order',
],
fields : [
{name : 'id', type : 'int'},
{name : 'lastname', type : 'string'}
{name : 'firstname', type : 'string'}
],
hasMany: 'Order' /* Generates a orders() method on every Customer instance */
});
注文
Ext.define('Order', {
extend : 'Ext.data.Model',
fields : [
{name : 'id', type : 'int'},
{name : 'customer_id', type : 'int'}, /* refers to the customer that this order belongs to*/
{name : 'date', type : 'date'}
],
belongsTo: 'Customer', /* Generates a getCustomer method on every Order instance */
hasMany: 'Product' /* Generates a products() method on every Order instance */
});
製品
Ext.define('Product', {
extend : 'Ext.data.Model',
fields : [
{name : 'id', type : 'int'},
{name : 'name', type : 'string'},
{name : 'description', type : 'string'},
{name : 'price', type : 'float'}
],
/*
I don't specify the relation to the "Order" model here
because it simply doesn't belong here.
Will it still work?
*/
hasMany: 'Order'
});
そして、以下が店舗です。
カスタマーストア
Ext.define('CustomerStore', {
extend : 'Ext.data.Store',
storeId : 'CustomerStore',
model : 'Customer',
proxy : {
type : 'ajax',
url : 'data/customers.json',
reader : {
type : 'json',
root : 'items',
totalProperty : 'total'
}
}
});
オーダーストア
Ext.define('OrderStore', {
extend : 'Ext.data.Store',
storeId : 'OrderStore',
model : 'Order',
proxy : {
type : 'ajax',
url : 'data/orders.json',
reader : {
type : 'json',
root : 'items',
totalProperty : 'total'
}
}
});
製品ストア
Ext.define('ProductStore', {
extend : 'Ext.data.Store',
storeId : 'ProductStore',
model : 'Product',
proxy : {
type : 'ajax',
url : 'data/products.json',
reader : {
type : 'json',
root : 'items',
totalProperty : 'total'
}
}
});
これは、企業とその製品の例です (私によるものではありません) http://superdit.com/2011/05/23/extjs-load-grid-from-another-grid/ . 2 つのモデルと 2 つのストアを使用しますが、関連付けの定義はありません。
前もって感謝します
-コンラッド