4

Extjs 4.1では、ローカルストレージプロキシはかなりバグがあるようです。私が何か間違ったことをしていると言ってください。

私は(他の人と同じように)サーバーからデータをロードし、オフラインで使用するためにローカルに保存しようとしています。私の問題は、データの更新(ブラウザでリロードを押す)に関係しています。 removeAll()レコードは削除されません。clear()ローカルストレージプロキシ自体を呼び出すことで、ローカルストレージをクリアできることを読みました。レコードが削除されている間、キージェネレーターはリセットされません。これが最終的に問題を引き起こすのではないかと心配しています。

私のコードでは、LocalStorageが誤動作する原因となるのは何ですか?モデルの設定IDが正しく設定されていると、多少注意が必要ですが、正しく実行していると思います。

モデルとストアは次のとおりです。

            Ext.define('MAP.model.LookupData', {
                extend: 'Ext.data.Model',

                idProperty:'localId',

                fields: [
                    'localId', // used for storing data via a localstorage proxy. -jg
                    'name',
                    'value'
                ]
            });


            Ext.define('MAP.store.LocalCloudConditionStore', {
                extend: 'Ext.data.Store',
                model: 'MAP.model.LookupData',
                storeId: 'localCloudConditionStore',

                proxy: {
                    type: 'localstorage',
                    id  : 'cloud-conditions'
                }

            });

removeAll()ローカルストアをクリアするために使用しようとしているコードは次のとおりです。

    offlineStore.load();
    offlineStore.removeAll();
    offlineStore.sync();

    Ext.each(records,function(record){
        var added = offlineStore.add(record.getData())[0];
        console.log(added.get('id'));
    });

    offlineStore.sync();

ローカルストレージプロキシがブラウザに書き込む内容:

最初のロード

そして、2回目のリロードは行います。以前のものは削除されません:

2回目のロード。 最初の負荷データは削除されません。

を使用しようとするproxy.clear()と、レコードは消えますが、idGeneratorシードはリセットされません。

    offline.getProxy().clear();

    Ext.data.StoreManager.register(offline);

    Ext.each(records,function(record){
        var added = offline.add(record.getData())[0];
        console.log(added.get('id'));
    });

    offline.sync();

カウンターはリセットされません!

あなたの眼球をありがとう。

アップデート

ローカルストアをインスタンス化する前に値を直接リセットすることで、ローカルストレージのカウンターをリセットすることができました。明らかに、これは予約から外れるので、理想的ではありません。

window.localStorage.setItem('cloud-conditions-counter',0);

var offline = Ext.create('MAP.store.LocalCloudConditionStore');

offline.getProxy().clear();

UPDATE DEUX

さらに考えてみると、カウンターをリセットしないのが正しいと思います。mysqlのテーブルが切り捨てられた場合、シーケンス番号はリセットされません。削除されたレコードのキャッシュされたID(たとえば、IDが1)を使用してテーブルからデータをプルした場合、問題が発生する可能性があります。削除されたレコードではなく、まったく異なるレコードが返されます。わかりました、理にかなっています。

それでも、なぜ一体が機能しないstore.removeAll(); store.sync()のですか?

4

1 に答える 1

1

これがバグかどうかはわかりremoveAll()ませんが、レコードが削除済みとしてマークされず、リモートまたはローカル ストレージに影響しないことは確かです (つまり、次の同期は何もしません)。remove()これは、実際にそうする - とは対照的です。

このメソッドを使用して、すべてのレコードを削除できます。

Ext.override(Ext.data.Store), { 

    removeAllForReal: function() {
        records = this.data.items,
        i = records.length;

        while (i--) {
            this.remove( records[i] );
        }
    }
});
于 2012-07-04T23:59:41.057 に答える