2010-09-06 2 views
1

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

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

http://test.virtual-chaos.net/messages/blah

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

<%@ 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

звучит как ошибка. Упорядочить любой код? – jcolebrand

+0

если у вас есть время, чтобы помочь мне отладить это, вы определенно рок. но, поскольку вы согласны с его ошибкой в ​​моем коде, я сам еще раз посмотрю. – djmc

+0

hmm .. вот еще ключ. это происходит только в IE. heh – djmc

ответ

0

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

  1. вы сделать вызов AJAX для извлечения набора список & cache to true: JQuery receiver es ответ на вызов, кэширует ответ и перенаправляет ответ на ваш код.
  2. вставить элемент: Предыдущий кэшируются список по-прежнему поддерживается JQuery и сделал не только что добавленный элемент
  3. вы делаете новый вызов Ajax для получения списка & установить кэш неверно: JQuery получает ответ на вызов. Поскольку вы сказали не кэшировать этот вызов, он просто перенаправляет ответ на ваш код. Таким образом, кеш-память содержит список, полученный от первого вызова.
  4. вы просите сохраненную копию: JQuery вперед вы только кэшированные копии имеет что без нового добавленного элемента
+0

да, это точно мой процесс. Я попытаюсь опубликовать код, чтобы уточнить. – djmc

+0

Это не просто процесс, который я объясняю здесь. Я также объясняю внутреннюю работу jquery. JQuery не отменяет вашу предыдущую кешированную копию, потому что вы не сказали ей кэшировать вызов ajax, чтобы получить список, в который добавлен новый элемент. Поэтому, я думаю, для решения проблемы кэшируйте все вызовы ajax, которые используются для извлечения списка, чтобы последний список перезаписывал предыдущий список в кеше. –

+0

Если я кэширую все вызовы ajax в jquery, как будет jquery знать, когда я хочу версию без кэша? Должна быть команда заставить его стереть кеш и вытащить живую версию. – djmc

Смежные вопросы