6

だから、これは少し奇妙です。Backbone と Backbone.localStorage を使用して、キャッシュ用にリモート データをローカル ストレージに保存しています。かなり標準的なもの。

ストア全体で a を実行するlocalStorage.clear()と、値の文字列配列を持つキーを除いて、すべての値が完全に消去されます。最初の検査でクリアされますが、ストレージが再度保存されるとBackbone.LocalStorage.sync('create', model);、以前の値がそこに戻されます。

もちろん、Chrome デベロッパー ツール内でキーを手動で削除すると、キーは消えたままになり、再入力されません。これは、localStorage.clear()呼び出しがまだ文字列配列でキーをキャッシュしているかのようです。アプリの起動時に最初にクリアされることを確認しました。

編集時にいくつかのコードとスクリーンショットをここに投稿しますが、キーが再入力された後もこれらの値が残るという事実を除いて、実際にはかなり標準的です。ここに何かアイデアはありますか?

編集: 見て楽しいコードがたくさん:

コレクション:

app.DiagnosisCollection = Backbone.Collection.extend({
    model: DiagnosisModel,
    localStorage: new Backbone.LocalStorage('diagnosis'),

    save: function(model) {
        Backbone.LocalStorage.sync('create', model);
    }
});

モデル:

app.DiagnosisModel = Backbone.Model.extend({

    urlRoot: app.ApiRoot,
    url: app.DiagnosisApi,

    initialize: function(options) {
        if(!options.query) {
            throw 'query must be passed to diagnosisModel';
        }

        this.local = false;
        this._query = options.query;
    },

    sync: function(method, model, options) {
        var diagnosisKey = localStorage.getItem('diagnosis');
        var index, diagnosisStore;

        if(diagnosisKey) {
            diagnosisKey = diagnosisKey.split(',');
        }

        index = _.indexOf(diagnosisKey, this._query);

        if(index !== -1) {
            diagnosisStore = localStorage.getItem('diagnosis' + '-' + diagnosisKey[index]);
        }

        if(diagnosisStore) {
            this.local = true;
            options.success(JSON.parse(diagnosisStore));
        }
        else {
            this.local = false;
            var fetchUrl = this.urlRoot + this.url + this._query;
            $.getJSON(fetchUrl, function(data, textStatus) {
                if(textStatus !== 'success') {
                    options.error();
                }
                options.success(data);
            });
        }
    }
});

return app.DiagnosisModel;

作業を行うコントローラー関数:

        var self = this;

        // Create a new collection if we don't already have one
        // The save function puts it in local storage
        if(!this.diagnosisCollection) {

            this.diagnosisCollection = new DiagnosisCollection();

            this.diagnosisCollection.on('add', function(diagModel) {
                this.save(diagModel);
            });
        }

        var diagModel = new DiagnosisModel({
            query: diagId
        });

        diagModel.fetch({
            success: function() {
                var diagView = new DiagnosisView({
                    model: diagModel
                });

                if(!diagModel.local) {
                    self.diagnosisCollection.add(diagModel);
                }

                self._switchPage(diagView);
            },
            error: function() {
                console.error("Diag Model Fetch Failed");
                Backbone.history.navigate('503', { trigger: true });
            }
        });

ちなみにlocalStorage.clear()通話はアプリ起動中。サーバー上のバージョンが変更されたかどうかを確認するために API 呼び出しを行います。バージョンが変更された場合は、localStorage を削除します。

4

1 に答える 1