在Sencha Touch 2中动态定义和加载带有不同代理存储的视图

Dynamically define and load views with different proxy store in Sencha Touch 2

本文关键字:代理 存储 视图 加载 Touch Sencha 动态 定义      更新时间:2023-09-26

我正在用Sencha Touch 2创建一个移动应用程序,它将根据来自服务器的Json响应动态加载其视图。

这意味着在加载视图之前,我必须用一些通用元素组合视图。例如,如果我从服务器接收到与List视图相对应的Json字符串,我将不得不动态地用storeproxy填充列表项(nameurl description )。

这是可行的,但是我想在列表中选择一些项目并加载另一个列表,但是这次我想更改代理。我的新代理是来自所选项目的url字段。我从选定的项目中获得url字段并更改代理,但这引入了一个问题:

我使用的是Ext.navigation。查看,我想维护导航历史记录。在上面的例子中,如果我回到导航历史记录,第一个列表中的项目会变成最后一个列表中的项目。

我正在寻找某种工作流程来实现视图的动态加载,依赖于每个视图的独立数据,并始终维护MVC-Store模式和导航历史。

这是列表项的模型:

Ext.define('ExampleApp.model.ListItem', {
    extend: 'Ext.data.Model',
    config: {
        fields: ['name', 'url', 'descriprion']
    }
}

这是List的存储:

Ext.define('ExampleApp.store.ListItems', {
    extend: 'Ext.data.Store',
    config: {
        autoLoad: false,
        model: 'ExampleApp.model.ListItem',
        proxy: {
            type: 'jsonp'
            url: 'http://mydomain.com/myjsonresponse',
            reader: {
                type: 'json',
                useSimpleAccessors: true
            }
        }
    }
})

这是我的观点:

Ext.define('ExampleApp.view.MyList', {
    extend: 'Ext.List',
    xtype: 'mylist',
    requires: ['ExampleApp.store.ListItems'],
    config: {
        title: 'My List',        
        itemTpl: '{name} - {description}',
        store: 'ListItems'
    }
})

这是在我的列表的itemtap事件上调用的函数:

listItemTapped: function (view, index, target, record, event) {
    var listItems = Ext.getStore('ListItems');
    listItems.getProxy().setUrl(record.get('url'));
    listItems.load();
    this.getMain().push({
        xtype: mylist
    });
}

您可以尝试为每个列表创建单独的存储,而不是重用现有的存储。

listItemTapped: function (view, index, target, record, event) {
    var listItems = Ext.create('ExampleApp.store.ListItems', {newUrl : record.get('url')});
    listItems.load();
    this.getMain().push({
        xtype: mylist,
        store: listItems
    });
}

并添加初始化函数以使用newUrl:

Ext.define('ExampleApp.store.ListItems', {
    extend: 'Ext.data.Store',
    config: {
        autoLoad: false,
        newUrl : null,
        model: 'ExampleApp.model.ListItem'
    },
    initialize : function() {
        this.setProxy({
            type: 'jsonp'
            url: this.config.newUrl,
            reader: {
                type: 'json',
                useSimpleAccessors: true
            }
        });
    }
})

你可能想要销毁这些商店一旦他们的视图弹出。

@ThinkFloyd同意我们需要在离开视图时销毁存储,因为当应用程序有许多视图和具有大量数据的较大存储时,它将在稍后产生问题。我最近也遇到了同样的问题,这对我帮助很大。谢谢