我正在使用 ST2 并使用 MVC。我对 ExtJS 和 Sencha 很陌生,所以对于许多事情来说,最佳实践并不公平——尽管进行了研究,但在这个问题上我已经走到了死胡同。
我将在下面使用一个玩具示例来说明我的问题,但本质上我的关系如下(从关联的角度来看,它们都可以正常工作)。
Business X -- Location A
|
-- Location N
问题
然后,我想将数据填充到(例如) anExt.dataview.List
中,但要对其进行处理,以使每个位置(即子位置)在表中都有自己的单独条目;不仅仅是一个简单的itemTpl
格式化单个条目。但是,目前我找不到任何方法来做到这一点。是否可以根据需要连接List
并格式化数据,或者我应该创建一个新商店?理想情况下,我想充分利用这些关联。
作为一个粗略的例子,每个条目看起来像这样,带有一些父数据和一些子数据:
---------------------------
|Smith Co - 1 Smith Street|
---------------------------
|Smith Co - 24 High Street|
---------------------------
|Tea[...] - 12 Tea Leaf |
---------------------------
|Tea[...] - 3 Bis Kit |
---------------------------
示例代码
原始数据
[
{
"id":1,
"name":"Smith Co",
"locations":[
{
"address":"1 Smith Street"
},
{
"address":"24 High Street"
}
]
},
{
"id":2,
"name":"Tea So Good",
"locations":[
{
"address":"12 Tea Leaf"
},
{
"address":"3 Bis Kit"
}
]
}
]
位置模型
Ext.define('Example.model.Location', {
extend: 'Ext.data.Model',
config: {
fields: [
{ name: 'address', type: 'string' }
],
proxy: { ... }, // Rest proxy that loads data as shown above.
BelongsTo: 'Example.model.Company'
}
});
公司模式
Ext.define('Example.model.Company', {
extend: 'Ext.data.Model',
config: {
fields: [
{ name: 'id', type: 'int' },
{ name: 'name', type: 'string' }
],
proxy: { ... }, // Rest proxy that loads data as shown above.
hasMany: { model: 'Example.model.Location', name: 'locations' }
}
});
店铺
Ext.define('Example.store.Companies', {
extend: 'Ext.data.Store',
require: 'Example.model.Company',
config: {
model: 'Example.model.Company'
}
});
控制器
// (works correctly, relationships are traversable)
// Companies store is looked up and loaded in #launch()
看法
Ext.define('Example.view.CompaniesList', {
extend: 'Ext.List',
xtype: 'companieslist',
config: {
layout: 'fit',
store: 'Businesses',
itemTpl: [
// Tpl is only to format inside each element
]
}
});
解决方案编辑(2013 年 9 月 15 日):
解决方案
我使用了@rixo 建议的解决方案(我一直希望在最初的问题中避免)。
我为列表创建了一个单独的存储,并通过使用存储上的load
侦听器将我需要的数据加载到其中Companies
。这似乎是可用的最优雅的解决方案,尽管这意味着您可能需要在不同的地方添加额外的逻辑以确保它保持令人满意的同步。
通过将位置对象本身推送到新存储中,关联保持不变(即您仍然可以这样做location.getCompany()
)。