backbone.js读取结果caching
我在下面的backbone.js控制器的索引操作中使用fetch:
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."); } }); } });
问题是结果正在被caching。 它不会select数据库更改。 无论如何告诉backbone.js不要caching结果?
我知道我可以重写集合的URL并附加一个时间戳,但我正在寻找一些比这更干净的东西。
这通常是IE的一个问题,主干与它无关。 你必须下载到jQuery的Ajax调用,看看文档。 Backbone使用jquery ajax作为同步方法。 你可以做这样的事情在所有的浏览器上强制Ajax调用:
$.ajaxSetup({ cache: false });
@朱利安的build议将工作,但每个AJAX请求将打到服务器,没有什么会从caching中检索。
$.ajaxSetup({ cache: false });
还有另一种方法做这个。 您可以将“cache:false”作为提取选项(请参阅下面的代码)。 好处是具有“cache:false”的提取将始终命中服务器,而其他提取可能会从caching中检索数据。 我正在写的应用程序,asynchronous访问数据和内容。 有时我希望从caching中检索项目,有时我想打到服务器。
http://documentcloud.github.com/backbone/#Collection-fetch
jQuery.ajax选项也可以作为提取选项直接传递,因此可以获取分页集合的特定页面:Documents.fetch({data:{page:3}})
您也可以覆盖与此代码类似的集合的获取方法。
var PlanMembers = Backbone.Collection.extend({ ... fetch: function (options) { options = options || {}; options.cache = false; return Backbone.Collection.prototype.fetch.call(this, options); } ... })
。
下面我添加了“cache:false”到fetch
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."); } });
另一个解决scheme是防止HTTP标头在服务器端的caching
在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"
添加“caching:假”取得工作!
this.foo.fetch({ cache:false });
我能够修复只有在开发工具没有被使用时出现在IE中的错误。