如何在 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() 方法可能就是您所需要的。