6

所以,这有点奇怪。我正在使用 Backbone 和 Backbone.localStorage 将远程数据保存到本地存储以进行缓存。很标准的东西。

当我localStorage.clear()在整个商店上运行 a 时,所有值都将被永久清除,除了具有值字符串数组的键。它在第一次检查时被清除,但是当存储再次保存时,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

1

而不是localStorage.clear(),使用:

localStorage.removeItem('userInfo');

我在我的主干应用程序中遇到了同样的问题,我用这种方式清除了这些值。

Ps:是的,您需要一一指定所有本地存储变量..:(..但这很好用。

于 2013-08-28T12:30:28.110 回答