【问题标题】:sencha touch accordion list not loading datasencha touch 手风琴列表未加载数据
【发布时间】:2014-10-19 06:21:45
【问题描述】:

我不知道为什么我的数据不会从这里加载到我的 AccordionList 元素: https://github.com/kawanoshinobu/Ext.ux.AccordionList

我在这样的面板中创建它:

{
    xtype: 'accordionlist',
    store: Ext.create('Rks.store.Bcks'),
    flex: 1
},

它调用一个定义如下的商店:

Ext.define('Rks.store.Bcks', {
    extend: 'Ext.data.TreeStore',
    requires: ['Rks.model.Bck'],
    config: {
        itemId: 'bks',
        model: 'Rks.model.Bck',
        defaultRootProperty: 'items',
        proxy: {
            type: 'ajax',
            url: 'path/to/ajax',
        },
        autoLoad: false,
        listeners:{
            load: function( me, records, successful, operation, eOpts ){
                console.log("data loaded", records);
            } 
        }
     }
});

当我调用包含手风琴的视图时,控制台会记录看起来不错的对象:

items: [{bck_id:3, author_id:1, title:test, items:[{c_id:2, bck_id:3, title:choice1, leaf:true}]}]

但是什么都没有出现。面板是空的,没有显示手风琴项。

但是,当我用内联 JSON 替换代理时,一切看起来都很好:

Ext.define('Rks.store.Bcks', {
    extend: 'Ext.data.TreeStore',
    requires: ['Rks.model.Bck'],
    config: {
        itemId: 'bks',
        model: 'Rks.model.Bck',
        defaultRootProperty: 'items',
        root: {
            items: [
                    { bck_id: 1, author_id: 1, title: 'bck1', items: [ {c_id: 1, bck_id: 1, title: 'choice1', leaf: true} ] }
                ]
        }
        autoLoad: false,
        listeners:{
            load: function( me, records, successful, operation, eOpts ){
                 console.log("data loaded", records);
            } 
        }
    }
});

这里的项目显示在手风琴中。我无法弄清楚为什么第二个示例有效而第一个示例无效。在为 Accordion 调用商店代理时,我应该做些什么特别的事情吗?

更新:我已经设法让手风琴列表显示数据,但是当我更改商店的 url 并重新加载它时,商店重新加载但手风琴列表没有更新。手风琴列表继续显示它从第一个 URL 接收到的数据,而不是从带有修改的 URL 的重新加载中接收到的数据。

谢谢

【问题讨论】:

    标签: sencha-touch-2 accordion


    【解决方案1】:

    我想我想通了。对于手风琴列表组件,您需要这样做:

                    var accordionlist = Ext.ComponentQuery.query('rdb #rdb1')[0];
                    var brickstore = Ext.getStore('bcs');
                    bcs.removeAll();
                    bcs.getProxy().setUrl('newurl');
                    accordionlist.setStore(bcs);
                    accordionlist.load();
    

    基本上,手动删除所有项目,设置新的url,在列表上设置商店,然后加载列表。

    【讨论】:

    • 我也使用这种方式将新数据加载到我的手风琴中。当列表随着更多记录增长时,您是否感到任何缓慢?我正面临一个大问题,当我尝试使用 store.removeAll() 清除数据时,我的列表花费了太多时间来清除记录,它在处理少量记录时效果很好。当列表增长到 40 或 60 条记录时,它真的会挂起应用程序。请回复您的经历
    • @Dibish - 我实际上一次只使用 5-10 个元素,所以没有看到任何缓慢,但这可能是由于列表的长度。
    • 感谢您的回复,这可能是问题所在。我的列表中有大约 200 到 400 条记录。使用分页来显示所有内容。所以我必须找到其他方法来解决这个问题..
    【解决方案2】:

    我认为您的代理配置有问题。首先,删除defaultRootProperty 配置(不在proxy 配置中),然后试试这个:

        proxy: {
            type: 'ajax',
            url: (your ajax url),
            reader: {
                type: 'json',
                rootProperty: 'items'
            }
        },
    

    【讨论】:

    • 我应该提到 - 我已经尝试过了,以及许多其他变体。我又试了一次,它产生了相同的结果:我通过网络得到一个结果对象: {"items":[{"bck_id":3,"author_id":1,"title":"test","items" :[{"c_id":2,"bck_id":3,"title":"choice1","leaf":true}]}]},但手风琴列表中没有显示
    • 不确定但你可以试试 { xtype: 'accordionlist', store: Ext.getStore('storeid'), flex: 1 },
    • Uncaught TypeError: Object # has no method 'getStore'
    猜你喜欢
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 2012-08-18
    • 2023-03-29
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多