2011-05-30 10 views
41

estoy usando pelota en la acción index del controlador de la siguiente Backbone.js:Backbone.js extraer resultados en caché

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."); 
      } 
     }); 
    } 
}); 

El problema es que los resultados están siendo almacenados en caché. No recoge los cambios en la base de datos. ¿Hay alguna forma de decirle a backbone.js que no guarde en caché los resultados?

Sé que podría anular la URL de la colección y anexar una marca de tiempo, pero estoy buscando algo un poco más limpio que eso.

+0

Mismo problema aquí. –

+2

Intentando confirmar lo que estás preguntando.Hace una búsqueda que hace una llamada AJAX bajo las cubiertas que utiliza el navegador para hacer la llamada. ¿Y el navegador no realiza la llamada porque cumple las directivas de caché? Básicamente, esto puede no ser un problema de backbone.js ya que backbone.js no almacena en caché. Siempre reemplaza todos los modelos de la colección con lo que recibe. Tal vez agregue algunos detalles XHR del navegador a su pregunta y aclare un poco más lo que está preguntando. –

Respuesta

57

Esto es un problema en IE y la red troncal no tiene nada que ver con eso. Tienes que ir a la llamada jQuery ajax y mirar el documento. Backbone usa jquery ajax para su método de sincronización. Se puede hacer algo como esto para forzar llamada AJAX en todos los navegadores:

$.ajaxSetup({ cache: false }); 

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

+1

Gracias. Simple y directo! –

+1

Me has ahorrado tanto dolor que ni siquiera conoces. –

+0

@ErikAhlswede ಠ_ಠ – pabo

3

Otra solución es evitar el almacenamiento en caché en el lado del servidor con cabeceras 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 
?> 

o algo así en node.js con express y coffeescript

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

La recomendación de @ Julien funcionará, pero todas las solicitudes AJAX llegarán al servidor y no se recuperará nada del caché.

$.ajaxSetup({ cache: false }); 

Hay otra forma de hacerlo. Puede pasar "caché: falso" como una opción en la búsqueda (ver código a continuación). El beneficio es que fetch (s) que tienen "cache: false" siempre golpearán el servidor y las otras fetch (es) pueden recuperar datos del caché. La aplicación que estoy escribiendo actualmente, accede a los datos y al contenido de forma asíncrona. A veces deseo recuperar elementos de la memoria caché y, a veces, quiero acceder al servidor.

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

opciones jQuery.ajax también se pueden pasar directamente como buscar a opciones, por lo a buscar a una página específica de una colección paginado: Documents.fetch ({Datos: {página: 3}})

También puede anular el método de búsqueda de la colección similar al código.

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

.

A continuación añade que "cache: true" a la zona de alcance

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."); 
      } 
     }); 
+8

Probado esto, y en Backbone 0.9.10 el parámetro de opciones es nulo. Terminé haciendo esto: 'fetch: function (options) {options = options || {}; options.cache = false; return Backbone.Collection.prototype.fetch.call (this, options);} ' –

+0

Esta respuesta, con la adición de @ PålOliver es definitivamente el camino a seguir. Backbone (y otros) y Requerir ayuda para evitar dependencias globales. Ser explícito es la mejor opción imo. – Hypnovirus

0

'cache: false' Adición a buscar trabajado!

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

Pude solucionar un error que solo aparecía en IE cuando las herramientas de desarrollo no se estaban utilizando.

Cuestiones relacionadas