gpt4 book ai didi

json - 显示来自嵌套 json : Sencha Touch 2 的列表

转载 作者:行者123 更新时间:2023-12-04 13:42:33 26 4
gpt4 key购买 nike

我有一个列表,其中显示带有餐厅 Logo 等的餐厅列表。

观点

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('')
}
});

当您点击餐厅时,我希望它根据所点击的项目显示另一个列表。

第二个 View
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 中的代理配置中存储,您的 JSON 的 roog 的配置是 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 .
  • 您需要要求您在使用它们的类中使用的任何类。例如,您需要 Sencha.model.Menu Sencha.model.Contact 中的类类,所以将它添加到 requires里面的属性(property)Contact.js :
    Ext.define('Sencha.model.Contact', {
    extend: 'Ext.data.Model',
    requires: ['Sencha.model.Menu'],

    ...
    });
  • 您需要使用 associationKey在您的 hasMany 关联中,它通常会查找 menus (从模型名称生成),但在您的 JSON 中是 menu .
  • hasManybelongsTo配置应该在config里面在您的模型中阻止。
    Ext.define('Sencha.model.Contact', {
    extend: 'Ext.data.Model',
    requires: ['Sencha.model.Menu'],

    config: {
    ...

    hasMany: {
    model: "Sencha.model.Menu",
    associationKey: 'menu'
    }
    }
    });

  • 至于 解决方案 :) - 你可以修改你的 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

    关于json - 显示来自嵌套 json : Sencha Touch 2 的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9949229/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com