我有一个列表,显示带有餐厅徽标等的餐厅列表。
风景
Ext.define('Test.view.Contacts', { extend: 'Ext.List', xtype: 'contacts', config: { title: 'Stores', cls: 'x-contacts', store: 'Contacts', itemTpl: [ '<div class="headshot" style="background-image:url(resources/images/logos/{logo});"></div>', '{name}', '<span>{add1}</span>' ].join('') } });
当您点击餐厅时,我希望它根据所点击的商品显示另一个列表。
第二种观点
Ext.define('Test.view.Menu', { extend: 'Ext.List', xtype: 'contact-menu', config: { title: 'Menu', cls: 'x-contacts', store: 'Contacts', itemTpl: [ '<div>{item}</div>' ].join(''), }, });
型号
Ext.define('Test.model.Contact', { extend: 'Ext.data.Model', config: { fields: [ 'name', 'logo', 'desc', 'telephone', 'city', 'add1', 'post', 'country', 'latitude', 'longitude' ], proxy: { type: 'ajax', url: 'contacts.json' } }, hasMany: { model: "Test.model.Menus", name: 'menus' } }); Ext.define('Test.model.Menus', { extend: 'Ext.data.Model', config: { fields: [ 'item' ] }, belongsTo: "Test.model.Contact" });
店铺
Ext.define('Test.store.Contacts', { extend: 'Ext.data.Store', config: { model: 'Test.model.Contact', autoLoad: true, //sorters: 'name', grouper: { groupFn: function(record) { return record.get('name')[0]; } }, proxy: { type: 'ajax', url: 'contacts.json', reader: { type: 'json', root: 'stores' } } } });
JSON
{ "stores": [{ "name": "Science Gallery", "logo": "sciencegallery.jpg", "desc": "Get some food", "telephone": "016261234", "city": "Dublin", "add1": "Pearse Street", "post": "2", "country": "Ireland", "latitude": "53.34422", "longitude": "-6.25006", "menu": [{ "item": "SC Sandwich" }, { "item": "SC Toasted Sandwich" }, { "item": "SC Panini" }, { "item": "SC Ciabatta" }, { "item": "SC Burrito" }] }, { "name": "Spar", "logo": "spar.jpg", "desc": "Get some food", "telephone": "016261234", "city": "Dublin", "add1": "Mayor Street", "post": "2", "country": "Ireland", "latitude": "53.34422", "longitude": "-6.25006", "menu": [{ "item": "Spar Sandwich" }, { "item": "Spar Toasted Sandwich" }, { "item": "Spar Panini" }, { "item": "Spar Ciabatta" }, { "item": "Spar Burrito" }] }] }
我想显示所选餐厅的菜单项列表(项目,项目,项目…),但是当我使用嵌套列表时,我必须使用与上一个列表相同的模板,这不适合我的需要。目前,我得到的物品数量正确,但没有任何显示。谢谢,您能帮我解决我的问题吗。
在获得解决方案之前,这里有一些您的代码问题(在解决方案生效之前需要解决这些问题):
Contacts
rootProperty
root
proxy: { type: 'ajax', url: 'contacts.json', reader : { type : 'json', rootProperty : 'stores' }
}
您也可以将这段代码放入模型中,因为您已经在其中放置了代理配置。这两个都合并了(应该在模型内部,并从商店中删除代理):
proxy: { type: 'ajax', url: 'contacts.json', reader : { type : 'json', rootProperty : 'stores' } }
模型名称应始终为单数,因为它们代表一个对象。所以用Menu,不要用Menus。
Menu
Menus
您需要在使用它们的类中要求使用的任何类。例如,您需要在Sencha.model.Menu类内部Sencha.model.Contact添加类,因此请将其添加到内部的requires属性中Contact.js:
Sencha.model.Menu
Sencha.model.Contact
requires
Contact.js
Ext.define('Sencha.model.Contact', { extend: 'Ext.data.Model', requires: ['Sencha.model.Menu'], ...
});
您需要associationKey像通常那样在hasMany关联中使用menus(从Model名称生成),但在JSON中使用它menu。
associationKey
menus
menu
hasMany和belongsTo配置应该config在模型的内部。
hasMany
belongsTo
config
Ext.define('Sencha.model.Contact', { extend: 'Ext.data.Model', requires: ['Sencha.model.Menu'], config: { ... hasMany: { model: "Sencha.model.Menu", associationKey: 'menu' } }
至于 解决方案 :)-您可以itemTpl在列表内部进行修改,以显示与正在显示的记录相关的信息。为此,您可以使用:
itemTpl
<tpl for="associatedModelName"> {field_of_associated_model} </tpl>
因此,根据您的情况,您可以执行以下操作:
itemTpl: [ '{name}', '<div>', '<h2><b>Menu</b></h2>', '<tpl for="menus">', '<div> - {item}</div>', '</tpl>', '</div>' ].join('')
这是一个项目的下载(使用SDK工具生成),该项目包括一个演示,主要使用您的代码:http : //rwd.me/FS57