Результаты кэширования backbone.js
Я использую fetch в действии индекса следующего контроллера 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-адрес коллекции и добавить временную метку, но я ищу что-то немного более чистое, чем это.
Ответы
Ответ 1
Это проблема в IE, и основная магистраль не имеет к этому никакого отношения. Вам нужно спуститься к вызову jQuery ajax и посмотреть на документ. Магистраль использует jquery ajax для своего метода синхронизации. Вы можете сделать что-то подобное, чтобы принудительно вызвать ajax-вызов во всех браузерах:
$.ajaxSetup({ cache: false });
http://api.jquery.com/jQuery.ajaxSetup/
Ответ 2
Рекомендация @Julien будет работать, но каждый запрос AJAX попадет на сервер и ничего не будет извлечено из кеша.
$.ajaxSetup({ cache: false });
Есть и другой способ сделать это. Вы можете передать "cache: false" в качестве опции в выборке (см. Код ниже). Преимущество заключается в том, что выборки (ы), которые имеют "cache: false" , всегда будут попадать на сервер, а другие выборки могут извлекать данные из кеша. Приложение Im в настоящее время записывает, обрабатывает данные и содержимое асинхронно. Иногда я хочу, чтобы элементы извлекались из кеша, а иногда я хочу попасть на сервер.
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.");
}
});
Ответ 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 с выражением и coffeescript
res.send results,
"Cache-Control": "no-cache, must-revalidate"
"Expires": "Sat, 26 Jul 1997 05:00:00 GMT"
Ответ 4
Добавление 'cache: false' для извлечения выполненных!
this.foo.fetch({ cache:false });
Мне удалось исправить ошибку, которая появилась только в IE, когда инструменты dev не использовались.