6 votes

Après une limpidité, localStorage se souvient des valeurs précédentes

Alors, c'est un peu étrange. J'utilise Backbone et Backbone.localStorage pour enregistrer des données distantes en local pour mettre en cache. Plutôt des choses standard.

Lorsque j'exécute un localStorage.clear() sur tout le magasin, toutes les valeurs sont effacées définitivement sauf pour la clé qui contient un tableau de valeurs. Il est effacé à première vue, mais ensuite lorsque le stockage est de nouveau enregistré avec Backbone.LocalStorage.sync('create', model); les valeurs précédentes sont de retour.

Évidemment, si je supprime manuellement la clé dans les outils de développement de Chrome, alors elle reste supprimée et n'est pas réinsérée. C'est comme si l'appel à localStorage.clear() conservait toujours les clés avec un tableau de chaînes. J'ai confirmé qu'il est initialement vidé au démarrage de l'application.

Je vais poster du code et des captures d'écran ici en éditant, mais c'est vraiment standard sauf pour le fait que ces valeurs restent après que la clé a été reconstituée. Des idées ici ?

EDIT : Beaucoup de code amusant à regarder :

Collection :

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

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

Modèle :

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;

Fonction du contrôleur qui fait le travail :

        var self = this;

        // Crée une nouvelle collection si nous n'en avons pas déjà une
        // La fonction save le stocke dans le 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 });
            }
        });

Au fait, l'appel localStorage.clear() est au démarrage de l'application. Il effectue un appel à l'API pour voir si la version sur le serveur a changé. Si la version a changé, alors nous vidons le localStorage.

1voto

Roy M J Points 2933

Au lieu de localStorage.clear(), utilisez :

localStorage.removeItem('userInfo');

J'ai rencontré le même problème dans mon application backbone et j'ai utilisé cette méthode pour effacer les valeurs.

P.s : Oui, vous devez spécifier toutes vos variables de stockage local une par une..:(.. Mais cela fonctionne bien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X