介绍
我正面临Ext.data.Model
ExtJS 中的类的应用程序设计问题。我将在这里尝试将我的想法发展为一个非常常见的在线商店场景,因此您可以关注我。我真的很感激任何对我的想法和结论的评论!
楷模
假设您想将“每个客户都可以订购多种产品”这一事实映射到 ExtJS。从简单的话可以识别出这三个模型:Customer
、Order
和Product
。在Order
这种情况下,连接Customer
s 和
Product
s。
协会
我发现 ExtJS 实际上允许您使用and类来指定这种(Customer)1-n(Order)1-n(Product)
关系。但这就是人们想要的吗?您是否希望 a始终属于 a ?如果你想拥有一个与s 没有任何联系的s 列表怎么办?Ext.data.HasManyAssociation
Ext.data.BelongsToAssociation
Product
Order
Product
Order
专卖店
这是它获得更多 ExtJS 特定的地方。在 ExtJS 中,您必须Ext.data.Store
s 来保存所有数据。对我来说,组织数据的一种自然方式是为Ext.data.Store
我的每个模型设置一个:
CustomerStore
OrderStore
ProductStore
考虑Ext.grid.Panel
并排放置一个 3 s;每个商店一个。在一个网格中选择客户时,他的订单会自动显示在第二个网格中。在第二个网格中选择订单时,相关产品会出现在第三个网格中。
这听起来自然吗?如果没有,请发表评论!
把这一切放在一起
所以现在我们需要把三件事放在一起:
- 模型及其
- 关联 (
hasMany
,belongsTo
) 和 - 数据(
Store
秒)
是否可以仅从模型-模型关系的一侧定义关联?例如,我可以指定一个Order
hasMany
Product
s 但忽略那个 a Product
belongsTo
anOrder
吗?因为一个Product
实际上可以属于多个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/。它使用两个模型和两个商店,但没有定义关联。
先感谢您
-康拉德