41 votes

backbone.js recherche des résultats en cache

J'utilise fetch dans l'action index du contrôleur backbone.js suivant :

App.Controllers.PlanMembers = Backbone.Controller.extend({
    routes: {
        "": "index"
    },

    index: function () {
        var planMembers = new App.Collections.PlanMembers();

        planMembers.fetch({
            success: function () {
                var recoveryTeam = planMembers.select(function (planMember) {
                    return planMember.get("TeamMemberRole") == "RecoveryTeam";
                });

                var otherMembers = planMembers.select(function (planMember) {
                    return planMember.get("TeamMemberRole") == "Other";
                });

                new App.Views.Index({ collection: { name: "Team", members: recoveryTeam }, el: $('#recoveryTeam') });

                new App.Views.Index({ collection: { name: "Team", members: otherMembers }, el: $('#otherTeam') });
            },
            error: function () {
                alert('failure');
                showErrorMessage("Error loading planMembers.");
            }
        });
    }
});

Le problème est que les résultats sont mis en cache. Ils ne tiennent pas compte des modifications apportées à la base de données. Est-il possible d'indiquer à backbone.js de ne pas mettre les résultats en cache ?

Je sais que je pourrais remplacer l'url de la collection et ajouter un horodatage, mais je cherche quelque chose d'un peu plus propre que cela.

57voto

Julien Points 7456

C'est un problème sur IE habituellement et backbone n'a rien à voir avec cela. Il faut aller jusqu'à l'appel jQuery ajax et regarder la documentation. Backbone utilise jquery ajax pour sa méthode de synchronisation. Vous pouvez faire quelque chose comme ceci pour forcer l'appel ajax sur tous les navigateurs :

$.ajaxSetup({ cache: false });

http://api.jquery.com/jQuery.ajaxSetup/

37voto

BarDev Points 3304

La recommandation de @Julien fonctionnera, mais chaque requête AJAX touchera le serveur et rien ne sera récupéré du cache.

$.ajaxSetup({ cache: false });

Il existe une autre façon de procéder. Vous pouvez passer "cache : false" comme option dans la récupération (voir le code ci-dessous). L'avantage est que les requêtes qui ont "cache:false" atteindront toujours le serveur et que les autres requêtes pourront récupérer des données dans le cache. L'application que je suis en train d'écrire accède aux données et au contenu de manière asynchrone. Parfois, je veux que les éléments soient récupérés à partir du cache et parfois je veux atteindre le serveur.

http://documentcloud.github.com/backbone/#Collection-fetch

Les options de jQuery.ajax peuvent également être transmises directement en tant qu'options de récupération, ainsi pour récupérer une page spécifique d'une collection paginée : Documents.fetch({data : {page : 3}})

Vous pouvez également surcharger la méthode fetch de la collection de manière similaire à ce code.

var PlanMembers = Backbone.Collection.extend({
     ...
     fetch: function (options) {
         options = options || {};
         options.cache = false;
         return Backbone.Collection.prototype.fetch.call(this, options);
     }
     ...
})

.

Ci-dessous, j'ai ajouté "cache : false" à la recherche.

planMembers.fetch({
            cache: false,  //Hit the server
            success: function () {
                var recoveryTeam = planMembers.select(function (planMember) {
                    return planMember.get("TeamMemberRole") == "RecoveryTeam";
                });

                var otherMembers = planMembers.select(function (planMember) {
                    return planMember.get("TeamMemberRole") == "Other";
                });

                new App.Views.Index({ collection: { name: "Team", members: recoveryTeam }, el: $('#recoveryTeam') });

                new App.Views.Index({ collection: { name: "Team", members: otherMembers }, el: $('#otherTeam') });
            },
            error: function () {
                alert('failure');
                showErrorMessage("Error loading planMembers.");
            }
        });

3voto

Drew LeSueur Points 2507

Une autre solution consiste à empêcher la mise en cache du côté serveur avec des en-têtes HTTP

en php

<?php
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
?>

ou quelque chose comme ceci en node.js avec express et coffeescript

res.send results,
  "Cache-Control": "no-cache, must-revalidate"
  "Expires": "Sat, 26 Jul 1997 05:00:00 GMT"

0voto

James Oh Points 1

L'ajout de 'cache:false' à la récupération a fonctionné !

this.foo.fetch({ cache:false });

J'ai pu corriger un bug qui n'apparaissait que dans IE lorsque les outils de développement n'étaient pas utilisés.

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