在明确之后,localStorage会记住以前的值

时间:2012-12-20 15:01:22

标签: javascript backbone.js local-storage

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

当我在整个商店中运行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调用以查看服务器上的版本是否已更改。如果版本已经更改,那么我们将nuke localStorage。

1 个答案:

答案 0 :(得分:1)

使用:

而不是localStorage.clear()
localStorage.removeItem('userInfo');

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

P.s:是的,你需要逐个指定所有的本地存储变量.. :( ..但是效果很好。