2011-05-30 39 views
41

我使用取下面的Backbone.js的控制器的索引动作:Backbone.js的提取结果缓存

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

的问题是,结果被缓存。它不会选择数据库更改。无论如何告诉backbone.js不要缓存结果?

我知道我可以覆盖集合的URL并附加一个时间戳,但我正在寻找比这更干净的东西。

+0

同样的问题在这里。 – 2011-05-30 18:36:19

+2

试图确认你在问什么。您可以在使用浏览器拨打电话的封面下进行一次AJAX调用。浏览器没有进行调用,因为它遵守缓存指令?基本上,这可能不是一个backbone.js问题,因为backbone.js没有缓存。它始终用收到的内容替换集合中的所有模型。也许在你的问题中增加一些浏览器的XHR细节,并澄清你的问题。 – 2011-05-31 00:31:37

回答

57

这是IE上的问题,通常和骨干网无关。您必须下载jQuery ajax调用并查看文档。 Backbone使用jquery ajax作为其同步方法。你可以做这样的事情,迫使所有的浏览器的AJAX调用:

$.ajaxSetup({ cache: false }); 

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

+1

谢谢。简单而直接! – 2013-10-25 22:14:19

+1

你已经救了我很多你甚至不知道的痛苦。 – 2015-02-12 21:56:20

+0

@ErikAhlswedeಠ_ಠ – pabo 2017-08-17 23:12:43

3

另一种解决方案是为了防止缓存在服务器端使用HTTP头

在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 
?> 

或类似的东西在node.js中使用express和coffeescript

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

@ Julien的建议可以工作,但是每个AJAX请求都会触发服务器,并且不会从缓存中检索任何内容。

$.ajaxSetup({ cache: false }); 

还有一种方法可以做到这一点。您可以在提取中将“cache:false”作为选项传递(请参阅下面的代码)。好处是,具有“cache:false”的提取将始终命中服务器,而其他提取可能会从缓存中检索数据。我正在编写的应用程序,异步访问数据和内容。有时我希望从缓存中检索项目,有时候我想要访问服务器。

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

jQuery.ajax选项也可以直接传递作为提取选项,所以 抓取分页集合中的特定页面: Documents.fetch({数据:{页:3}} )

您也可以重写与此代码类似的集合的获取方法。

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

下面我补充说:“缓存:假”以获取

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

经过测试,在Backbone 0.9.10中options参数为null。我结束了这样做: 'fetch:function(options){options = options || {}; options.cache = false;返回Backbone.Collection.prototype.fetch.call(this,options);}' – 2013-03-19 12:29:04

+0

这个答案,@PålOliver的补充肯定是要走的路。 Backbone(和其他)和Require可以帮助我们避免全局依赖。明确是imo的最佳选择。 – Hypnovirus 2015-01-07 16:02:27

0

添加“缓存:假”来获取工作!

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

我能够修复一个只在IE没有使用开发工具时出现的错误。