Sencha Touch商店中的独特价值

时间:2011-07-17 12:39:27

标签: javascript extjs

我正在使用Sencha Touch开发移动应用程序,并且需要在本地存储先前搜索的详细信息而不会重复。

搜索,存储和显示工作正常,但如果我进行两次相同的搜索,则该条目会在我的商店中重复。

我预计商店的“id”会这样做,但似乎有些不对劲。

以下是商店的代码。

    Ext.regModel('sSaved', {
        fields: [
            {name: 'IDs',        type: 'int'},
            {name: 'Outward',        type: 'string'},
            {name: 'Return',        type: 'string'},
            {name: 'Pickup',        type: 'string'},
            {name: 'Destination',        type: 'string'}
        ],
        proxy: {
            type: 'localstorage',
            id:'IDs'
        }
    });             

    var savedJobs = new Ext.DataView({
        store: new Ext.data.Store({
            model: 'sSaved',
            storeId: 'allSaved'     
        }),
        tpl: new Ext.XTemplate(
            '<tpl for=".">',
                '<table class="item" style="margin:auto;">',
                    '<tr><td class="title">ID</td><td>{IDs}</td></tr>',
                    '<tr><td class="title">Outward</td><td>{Outward}</td></tr>',
                    '<tr><td class="title">Return</td><td>{Return}</td></tr>',
                    '<tr><td class="title">Pickup</td><td>{Pickup}</td></tr>',
                    '<tr><td class="title">Destination</td><td>{Destination}</td></tr>',
                '</table>',
            '</tpl>'
        ),
        itemSelector: "table.item",
        autoHeight:true,
        emptyText: 'No Saved Jobs',
        autoLoad: true
    });     

设置商店的代码。

    var fetched = Ext.decode(result.responseText);
    var details = fetched.apiResponse.details;
    savedJobs.store.load();
    savedJobs.store.add({
        "IDs":details.ID, 
        "Outward":details.Outward,
        "Return":details.Return,
        "Pickup":details.Pickup,
        "Destination":details.Destination
    });
    savedJobs.store.sync();

我可以通过以某种方式搜索商店并在添加之前检查该值是否存在来解决这个问题,但是我确信有一种更简单的方法。

如果此搜索 - &gt; check-&gt; add是需要的方法,那么资源最少的方法是什么?

1 个答案:

答案 0 :(得分:1)

检查现有值不会受到伤害 - 我保证;)此外,您应该在load()完成后执行add()。由于加载是异步的(在配置中没有异步:false),你必须指定任何依赖于该数据发生的事情1)通过商店的'load'事件或2)通过指定商店负载配置的回调方法:

var fetched = Ext.decode(result.responseText);
var details = fetched.apiResponse.details;
savedJobs.store.load({
    callback: function() {
        if(!savedJobs.store.getById(details.ID) {
            savedJobs.store.add({
                "IDs":details.ID, 
                "Outward":details.Outward,
                "Return":details.Return,
                "Pickup":details.Pickup,
                "Destination":details.Destination
            });
        }
    }
});

savedJobs.store.sync();