清除后,localStorage 会记住以前的值

Posted

技术标签:

【中文标题】清除后,localStorage 会记住以前的值【英文标题】:After a clear, localStorage remembers previous values 【发布时间】:2012-12-08 03:15:30 【问题描述】:

所以,这有点奇怪。我正在使用 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 调用以查看服务器上的版本是否已更改。如果版本发生了变化,那么我们就对 localStorage 进行核对。

【问题讨论】:

所有浏览器都一样吗? jsfiddle.net/Antonimo/EVUHy 您正在使用本机 localStorage.clear() 清除它,但使用 Backbone.LocalStorage.sync 写入 localStorage,我的假设是 Backbone 在其内存中保留了数据的副本,它不认识您'已经使用本机方法清除了 localStorage,因此当调用 .sync 时,它会将所有内容写回 localStorage。 localStorage.clear() 在“应用程序启动”中被调用,是在 Backbone 启动之前吗?如果 Backbone 在您调用它之前加载它,它可能已经将数据从 localStorage 读取到它的内存中。 打开chrome开发工具并清除本地存储。资源 -> 本地存储 你可能想看看这个:***.com/questions/9911588/… 【参考方案1】:

代替localStorage.clear(),使用:

localStorage.removeItem('userInfo');

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

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

【讨论】:

以上是关于清除后,localStorage 会记住以前的值的主要内容,如果未能解决你的问题,请参考以下文章

解决微信自动清除缓存,每天都需要重新登录

JS(定时器、 sessionStorage、 localStorage)

清除 GVnix 数据表过滤器

用localStorage来存储数据的一些经验

cookie,localStorage和sessionStorage区别

前端 自定义网址功能 localStorage 本地存储?