Может кто-нибудь объяснить мне, почему невозможно сделать недействительным кеш в jquery? - PullRequest
1 голос
/ 06 сентября 2010

Я делаю ajax-вызов для получения списка, и кеш имеет значение true. Позже я вставляю новый элемент и снова получаю список, но на этот раз я установил для кэша значение false. Jquery правильно показывает мне правильный список. Именно в этот момент я ожидаю, что jquery начнет кэшировать этот обновленный список с новыми данными. Однако, когда я делаю еще один вызов списку и запрашиваю кэшированную копию ... он показывает мне исходный список без моих новых данных! Очевидно, он не сделал недействительными кэшированные данные.

Пожалуйста, кто-нибудь скажет мне, что я что-то напортачу, и описанный выше процесс вызван ошибкой в ​​моем коде.

http://test.virtual -chaos.net / сообщения / бла

(извините за язык)

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MessageListLoader>" %>
<%@ Import Namespace="GoFuckYourself.Web.Controllers.Messages.ViewModels" %>
<input type="submit" value="Add Message" id="addMessage" />
<% Html.RenderPartial("MessageList", Model.Messages); %>
<input type="submit" value="Previous" id="previousMessages" />
<input type="submit" value="Next" id="nextMessages" />
<div id="messageEditor">
</div>
<div class="messageListLoader">
<script type="text/javascript" id="$">
    var messagesPage = <%: Model.Page %>;

    function clearForm(form) {
        $(form).find(':input').each(function () {
            switch (this.type) {
                case 'password':
                case 'select-multiple':
                case 'select-one':
                case 'text':
                case 'textarea':
                    $(this).val('');
                    break;
                case 'checkbox':
                case 'radio':
                    this.checked = false;
            }
        });
    }

    function postForm(form, trigger) {
        var form = $(form);
        var action = form.attr("action");
        var serializedForm = form.serialize();

        $.post(action, serializedForm, function () {
            clearForm(form);
            $('body').trigger(trigger);
        });
    }

    function cancelForm(trigger) {
        $('body').trigger(trigger);
    }

    function LoadHtml(url, loadFromCache, placeholderid) {
        $.ajax({
            url: url,
            cache: loadFromCache,
            dataType: "html",
            success: function (data) {
                $(placeholderid).replaceWith(data);
            } 
        });
    }

    function LoadMessageList(loadFromCache) {
        var url = '<%: Url.Action("loadpage", "messages", new { CategoryName = Model.Category.CategoryName })%>' + '/' + messagesPage;
        LoadHtml(url, loadFromCache, '#messageList');
    }

    function LoadMessageAdder() {
        var url = '<%: Url.Action("insert", "messages", new { CategoryName = Model.Category.CategoryName }) %>';
        LoadHtml(url, true, '#messageEditor');
    }

    function LoadMessageUpdater(id) {
        var url = '<%: Url.Action("update", "messages", new { CategoryName = Model.Category.CategoryName }) %>' + '/' + id;
        LoadHtml(url, false, '#messageEditor');
    }

    function LoadMessageDeleter(id) {
        var url = '<%: Url.Action("delete", "messages", new { CategoryName = Model.Category.CategoryName }) %>' + '/' + id;
        LoadHtml(url, false, '#messageEditor');
    }

    $('body').bind('messageListRefreshEvent', function (e) {
        LoadMessageList(false);
        $('#messageEditor').text('');
    });

    $('body').bind('messageFormCancelEvent', function (e) {
        $('#messageEditor').text('');
    });

    $('#addMessage').click(function() {
        LoadMessageAdder();
    });

    $('#previousMessages').click(function() {
        messagesPage--;
        if(messagesPage < 0) { messagesPage = 0; }
        LoadMessageList(true);
    });

    $('#nextMessages').click(function() {
        messagesPage++;
        LoadMessageList(true);
    });
</script>

1 Ответ

0 голосов
/ 06 сентября 2010

Поправь меня, если я ошибаюсь:

  1. вы выполняете ajax-вызов для получения списка и устанавливаете кэш в true: JQuery получает ответ на вызов, кэширует ответ и пересылает ответ на ваш код.
  2. вы вставляете элемент: Предыдущий кэшированный список все еще поддерживается JQuery и не имеет вновь добавленного элемента
  3. вы делаете новый вызов ajax для получения списка и устанавливаете кэш на false: JQuery получает ответ на вызов. Поскольку вы сказали не кэшировать этот вызов, он просто перенаправляет ответ на ваш код. Таким образом, кэш-память содержит список, полученный при первом вызове.
  4. вы запрашиваете кэшированную копию: JQuery перенаправляет вам единственную кэшированную копию, которая у него есть без добавленного элемента
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...