我在以下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.");
}
});
}
});
问题是结果正在缓存。它不会获取数据库更改。反正告诉backbone.js不要缓存结果吗?
我知道我可以覆盖集合的url并添加时间戳,但我正在寻找比这更清洁的东西。
答案 0 :(得分:57)
这通常是IE上的一个问题,骨干与它无关。你必须转到jQuery ajax调用并查看doc。 Backbone使用jquery ajax作为其同步方法。您可以执行以下操作以强制所有浏览器调用ajax:
$.ajaxSetup({ cache: false });
答案 1 :(得分:36)
@ Julien的建议会起作用,但是每个AJAX请求都会到达服务器,并且不会从缓存中检索任何内容。
$.ajaxSetup({ cache: false });
还有另一种方法可以做到这一点。您可以将“cache:false”作为fetch中的选项传递(请参阅下面的代码)。好处是具有“cache:false”的fetch将始终命中服务器,而其他fetch可以从缓存中检索数据。我正在编写的应用程序,异步访问数据和内容。有时候我希望从缓存中检索项目,有时我想点击服务器。
http://documentcloud.github.com/backbone/#Collection-fetch
jQuery.ajax选项也可以直接作为fetch选项传递,所以 获取分页集合的特定页面: Documents.fetch({data:{page:3}})
您也可以覆盖集合的fetch方法,类似于此代码。
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.");
}
});
答案 2 :(得分: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
?>
使用express和coffeescript 在node.js中使用或类似的东西
res.send results,
"Cache-Control": "no-cache, must-revalidate"
"Expires": "Sat, 26 Jul 1997 05:00:00 GMT"
答案 3 :(得分:0)
添加&#39;缓存:false&#39;去取得工作!
this.foo.fetch({ cache:false });
我能够修复只在未使用开发工具时才出现在IE中的错误。