Подтвердить что ты не робот

Результаты кэширования 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-адрес коллекции и добавить временную метку, но я ищу что-то немного более чистое, чем это.

4b9b3361

Ответ 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 не использовались.