我正在使用Sencha Touch 2创建一个移动应用程序,它将根据服务器的Json响应加载其视图。
这意味着在加载视图之前,我必须使用一些通用元素组成视图。例如,如果我从服务器收到对应于列表视图的Json字符串,则必须以dinamically方式填充列表项( name , url , descriprion )使用商店和代理商。
这有效,但后来我想在该列表中选择一些项目并加载另一个列表,但这次我想更改代理。我的新代理是所选项目中的 url 字段。我从所选项目中获取了 url 字段并更改了代理,但这引入了一个问题:
我正在使用 Ext.navigation.View ,我想维护导航历史记录。在上述情况下,如果我返回导航历史记录,则第一个列表中的项目将更改为最后一个列表中的项目。
我正在寻找某种工作流程来实现视图的动态加载,具体取决于每个视图的独立数据,并始终保持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
});
}
答案 0 :(得分:3)
您可以尝试为每个列表创建单独的存储,而不是重用现有列表。
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
}
});
}
})
您可能希望在弹出视图后销毁这些商店。
答案 1 :(得分:0)
@ThinkFloyd,同意我们离开视图时需要销毁商店,因为当应用程序有很多视图并且有大量数据存储时会产生问题。我最近面临同样的问题,这对我有很大的帮助......谢谢