Уникальные ценности в магазине Sencha Touch - PullRequest
1 голос
/ 17 июля 2011

Я занимаюсь разработкой мобильного приложения в 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();

Я мог бы обойти эту проблему, выполнив поиск в хранилище и проверив, существует ли значение перед добавлением, однако я уверен, что есть более простой метод.

Если этот поиск-> check-> add является подходом, который необходим, каков наименее ресурсоемкий способ?

1 Ответ

1 голос
/ 28 мая 2012

Проверка существующих значений не повредит - обещаю;) Кроме того, вы должны выполнить add () ПОСЛЕ окончания загрузки (). Поскольку загрузка выполняется в асинхронном режиме (без async: false в конфигурации), вы ДОЛЖНЫ либо задаете все, что зависит от этих данных: 1) через событие загрузки магазина или 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...