列出并存储绑定...完全相同的数据

发布于 2024-12-29 16:57:20 字数 2555 浏览 2 评论 0原文

我正在使用 sencha 创建一个具有多个卡片面板的轮播。每个面板都包含一个列表组件,该组件附加到其自己的商店实例。 所有列表存储实例都调用相同的 API 来获取数据,但使用不同的参数。

例子: 卡 1,列表 1 已附加到调用 mywebsite.com/api?node=1 的商店 1 卡 2,将列表 2 附加到调用 mywebsite.com/api?node=2 的存储 2,

卡 1 显示从 API 检索的正确节点集。但是,一旦我滑动查看卡 2,列表 1 和列表 2 都显示完全相同的数据,尽管每个列表都应该有自己的列表 od 数据。

代码:

Test.data.NodeStore = Ext.extend(Ext.data.Store, {
    constructor : function(config) {
        config = Ext.apply({
            model: 'Test.models.Node',
            autoLoad: false,
            pageSize: 20,
            proxy: {
                type: 'scripttag',
                url: Test.API.URL + '?action=getNodes',
                extraParams: {
                },
                reader: {
                    type: 'json'
                }
            },
            setSource: function(source) {
                if(this.getProxy().extraParams.sourceID != source) {
                    this.getProxy().extraParams.sourceID = source;
                }
            }
        }, config);                 
        Test.data.NodeStore.superclass.constructor.call(this, config);
    }, 

    onDestroy : function(config) {
        Test.data.NodeStore.superclass.onDestroy.apply(this, arguments);
    }
});
Ext.reg('NodeStore', Test.data.NodeStore);

列表视图:

Test.views.ListView = Ext.extend(Ext.Panel, {
    sourceID: 0,
    layout: {
        type: 'vbox',
        align: 'stretch'
    },
    items: [
        {
            xtype: 'list',
            itemTpl : new Ext.XTemplate("<div class='node'>{title}</div>"),
            store: Ext.create(Test.data.NodeStore, {}),
        }
    ],
    setSource: function(source) {
        this.sourceID = source;
        var store = this.items.get(0).getStore();

        store.setSource(source);

        store.load();
    }
});

动态创建列表视图的主视图

Test.views.Viewer = Ext.extend(Ext.Carousel, {  
    indicator: false,
    layout: 'card',
    style: {
        padding: '0 20px'
    },
    items: [

    ],
    loadListView: function(listIndex) {
        var currentRecord = Test.stores.ListStore.getAt(listIndex);
        var newList = new Test.views.ListView();
        newList.setSource(currentRecord.get('ID'));

        this.add(newList);
        this.doLayout();

    },
    initComponent: function() {
        Test.views.Viewer.superclass.initComponent.apply(this, arguments);
        loadListView(1);
        loadListView(2);
    }
});

这真的很奇怪...我只是想知道,sencha 是否分配完全相同的商店,模型,列表组件...不知道在哪里看

I am using sencha to create a carousel which has multiple card panels. Each panel contains a list component that is attached to its own instance of a store.
All lists store instances call the same API to fetch the data but with different parameters.

Example:
Card 1, Has list 1 attached to Store 1 which calls mywebsite.com/api?node=1
Card 2, Has list 2 attached to Store 2 which calls mywebsite.com/api?node=2

Card 1 shows the right set of nodes retrieved from the API. But once i swipe to see card 2, both list 1 and list 2 show the exact same data although each one should have its own list od data.

Code:

Test.data.NodeStore = Ext.extend(Ext.data.Store, {
    constructor : function(config) {
        config = Ext.apply({
            model: 'Test.models.Node',
            autoLoad: false,
            pageSize: 20,
            proxy: {
                type: 'scripttag',
                url: Test.API.URL + '?action=getNodes',
                extraParams: {
                },
                reader: {
                    type: 'json'
                }
            },
            setSource: function(source) {
                if(this.getProxy().extraParams.sourceID != source) {
                    this.getProxy().extraParams.sourceID = source;
                }
            }
        }, config);                 
        Test.data.NodeStore.superclass.constructor.call(this, config);
    }, 

    onDestroy : function(config) {
        Test.data.NodeStore.superclass.onDestroy.apply(this, arguments);
    }
});
Ext.reg('NodeStore', Test.data.NodeStore);

The list view:

Test.views.ListView = Ext.extend(Ext.Panel, {
    sourceID: 0,
    layout: {
        type: 'vbox',
        align: 'stretch'
    },
    items: [
        {
            xtype: 'list',
            itemTpl : new Ext.XTemplate("<div class='node'>{title}</div>"),
            store: Ext.create(Test.data.NodeStore, {}),
        }
    ],
    setSource: function(source) {
        this.sourceID = source;
        var store = this.items.get(0).getStore();

        store.setSource(source);

        store.load();
    }
});

The main view which creates list views dynamically

Test.views.Viewer = Ext.extend(Ext.Carousel, {  
    indicator: false,
    layout: 'card',
    style: {
        padding: '0 20px'
    },
    items: [

    ],
    loadListView: function(listIndex) {
        var currentRecord = Test.stores.ListStore.getAt(listIndex);
        var newList = new Test.views.ListView();
        newList.setSource(currentRecord.get('ID'));

        this.add(newList);
        this.doLayout();

    },
    initComponent: function() {
        Test.views.Viewer.superclass.initComponent.apply(this, arguments);
        loadListView(1);
        loadListView(2);
    }
});

This is really wierd... i am just wondering, is sencha assigning the exact same store, model, list component... don't know where to look

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浅笑依然 2025-01-05 16:57:20

在 loadListView 函数中,我必须创建一个存储对象并将其动态分配给列表,而不是修改现有存储。

newList.items.get(0).store = Ext.create(Test.data.NodeStore, {});

In the loadListView function, i had to create an object of store and assign it to the list dynamically rather than modifying existing store.

newList.items.get(0).store = Ext.create(Test.data.NodeStore, {});

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文