如何在 Sencha Touch 2 中有选择地填充商店
How to selectively populate a Store in Sencha Touch 2
我的 Sencha Touch 2.4.1 应用程序中有以下商店:
Ext.define('NativeApp.store.Item', {
extend: 'Ext.data.Store',
config: {
model: 'NativeApp.model.Item',
storeId: 'item-store',
fields: ['id', 'description'],
proxy: {
type: 'ajax',
url: 'resources/json/item.json',
reader: {
type: 'json',
rootProperty: 'items'
}
},
autoLoad: true
}
});
它正在填充 JSON 文件中的所有内容,假设看起来像这样:
{
"items": [
{
"id": 's1',
'description': 'desc'
},
{
"id": 's2',
'description': 'desc'
}
]
}
假设在我看来我有两个按钮,"s1" 和 "s2"。
如果我单击 "s1",我将转到一个页面,其中包含一个列表,其中包含 ID 为 "s1" 的数据。 (在这种情况下,只有一个,但可以有更多)。
如何实现?
想法一:
autoload
属性可以设置为对象。从 here - "If the value of autoLoad is an Object, this Object will be passed to the store's load() method."
因此,如果在我的控制器中,在点击按钮时执行的处理程序中,我可以生成此对象(解析 JSON 文件)并以某种方式将其传递给商店 - 任务已完成。有点。
除了如何传递给store的问题,眼前的问题是数据什么时候加载到store?
根据docs、"this store's load method is automatically called after creation"。是在应用程序启动时创建的,还是在我创建使用商店的视图对象时创建的:
var view = {xtype: 'myview'};
想法二:
也许我可以动态地从代理中切换出 url
并为每个 id 设置单独的 JSON 文件(不会太多)。但这似乎不太可能奏效。
想法三:
将 data
对象从该控制器传递到存储(再次解析 JSON)。
这些可行吗?如果没有,还有什么替代解决方案?
也许我想多了。
编辑:
我有一个项目列表,每个项目都有一个子项目列表。所以当我 select 一个项目时,我想被带到子项目的页面。现在,所有这些子项目都在一个 JSON 文件中,因此在单击一个项目后,我需要一种方法来告诉商店仅加载部分 json 数据。
Ext.data.model.load
仍然是最好的方法吗?
想法 1:
是的,你可以这样做......可能比 IMO 值得的麻烦更多。商店将在创建后立即加载——因此如果您在应用程序启动时创建商店,然后它会加载。如果您在运行时随机创建一个商店,它就会加载。如果商店是为视图内联定义的,则它会在创建视图时加载。
想法 2:
可以说是更好的解决方案,但是还是很麻烦把URL换成代理,然后强行加载,解析数据等等
根据您的观点,您可以使用 NativeApp.model.Item.load(id)
直接加载单个模型的数据(参见 docs)。这假设你有一个 API 设置,但 IMO 更容易,当然更 RESTful.
想法 3:
嗯。在我看来,Ext.data.Store 是您要完成的任务的错误结构。
你的想法可行吗?可行。
你是不是想多了? 有一点,但话又说回来,如果你不这样做,你就不会成为一名程序员。
如果没有看到您的应用程序的其余部分并理解您正在做 X、Y 或 Z 的 原因,很难准确地告诉您我会做什么...但是如果您只打算在给定的 "Detail" 屏幕上显示单个模型的数据(并且您需要按需加载该数据),那么静态 Ext.data.Model.load()
方法可能就是您所需要的。
我的 Sencha Touch 2.4.1 应用程序中有以下商店:
Ext.define('NativeApp.store.Item', {
extend: 'Ext.data.Store',
config: {
model: 'NativeApp.model.Item',
storeId: 'item-store',
fields: ['id', 'description'],
proxy: {
type: 'ajax',
url: 'resources/json/item.json',
reader: {
type: 'json',
rootProperty: 'items'
}
},
autoLoad: true
}
});
它正在填充 JSON 文件中的所有内容,假设看起来像这样:
{
"items": [
{
"id": 's1',
'description': 'desc'
},
{
"id": 's2',
'description': 'desc'
}
]
}
假设在我看来我有两个按钮,"s1" 和 "s2"。 如果我单击 "s1",我将转到一个页面,其中包含一个列表,其中包含 ID 为 "s1" 的数据。 (在这种情况下,只有一个,但可以有更多)。
如何实现?
想法一:
autoload
属性可以设置为对象。从 here - "If the value of autoLoad is an Object, this Object will be passed to the store's load() method."
因此,如果在我的控制器中,在点击按钮时执行的处理程序中,我可以生成此对象(解析 JSON 文件)并以某种方式将其传递给商店 - 任务已完成。有点。
除了如何传递给store的问题,眼前的问题是数据什么时候加载到store?
根据docs、"this store's load method is automatically called after creation"。是在应用程序启动时创建的,还是在我创建使用商店的视图对象时创建的:
var view = {xtype: 'myview'};
想法二:
也许我可以动态地从代理中切换出 url
并为每个 id 设置单独的 JSON 文件(不会太多)。但这似乎不太可能奏效。
想法三:
将 data
对象从该控制器传递到存储(再次解析 JSON)。
这些可行吗?如果没有,还有什么替代解决方案?
也许我想多了。
编辑:
我有一个项目列表,每个项目都有一个子项目列表。所以当我 select 一个项目时,我想被带到子项目的页面。现在,所有这些子项目都在一个 JSON 文件中,因此在单击一个项目后,我需要一种方法来告诉商店仅加载部分 json 数据。
Ext.data.model.load
仍然是最好的方法吗?
想法 1: 是的,你可以这样做......可能比 IMO 值得的麻烦更多。商店将在创建后立即加载——因此如果您在应用程序启动时创建商店,然后它会加载。如果您在运行时随机创建一个商店,它就会加载。如果商店是为视图内联定义的,则它会在创建视图时加载。
想法 2: 可以说是更好的解决方案,但是还是很麻烦把URL换成代理,然后强行加载,解析数据等等
根据您的观点,您可以使用 NativeApp.model.Item.load(id)
直接加载单个模型的数据(参见 docs)。这假设你有一个 API 设置,但 IMO 更容易,当然更 RESTful.
想法 3: 嗯。在我看来,Ext.data.Store 是您要完成的任务的错误结构。
你的想法可行吗?可行。
你是不是想多了? 有一点,但话又说回来,如果你不这样做,你就不会成为一名程序员。
如果没有看到您的应用程序的其余部分并理解您正在做 X、Y 或 Z 的 原因,很难准确地告诉您我会做什么...但是如果您只打算在给定的 "Detail" 屏幕上显示单个模型的数据(并且您需要按需加载该数据),那么静态 Ext.data.Model.load()
方法可能就是您所需要的。