2014-02-18 13 views
5

Ich benutze twitter's typeahead 0.10 mit Remote-URL, um JSON-Ergebnisse vom Server abzurufen.Typeahead 0.10 verhindern Caching

Ich möchte das Client-Caching verhindern, so dass die Suche immer auf dem Server stattfindet. Wie kann ich das machen?

Bitte siehe unten meinen Code:

// instantiate the bloodhound suggestion engine 
    var dataSource = new Bloodhound({ 
     datumTokenizer: function (d) { 
      return Bloodhound.tokenizers.whitespace(d.value); 
     }, 
     queryTokenizer: Bloodhound.tokenizers.whitespace, 
     remote: { 
      url: "../" + autocompleteInfo.ControllerName + "/" + autocompleteInfo.MethodName + "?term=%QUERY&ts=" + (new Date().getTime()), 
      filter: function (res) { 
       var data = []; 
       data = $.map(res, function (item) { 
        return { label: item.Name, id: item.Id, autocompleteInfo: autocompleteInfo, cssClass: item.Class }; 
       }); 

       return data; 
      } 
     }, 
     limit: 15, 
     name: 'typeaheadSourceCache', 
     ttl: 0, 
     ajax: { 
      cache: false 
     } 
    }); 

    dataSource.initialize(); 

    $("#" + autocompleteInfo.AutocompleteId).typeahead({ 
     minLength: 3, 
     highlight: true, 
     autoselect: true 
    }, 
     { 
      displayKey: 'label', 
      source: dataSource.ttAdapter(), 
      templates: { 
       suggestion: Handlebars.compile(
       '<div class="searchItem {{cssClass}}">{{label}}</div>' 
       ) 
      } 
     }); 
+0

Es kann von Interesse sein, dass andere in der Twitte zu wissen r typeahead community haben die gleichen Probleme und Lösungen werden untersucht. Siehe zum Beispiel: https://github.com/twitter/typeahead.js/pull/703 – Phil

+0

siehe auch https://github.com/twitter/typeahead.js/issues/564 –

Antwort

0

Try typeahead zu zerstören utils zu verwenden, ich in Ihrem Fall denken sind:

$("#" + autocompleteInfo.AutocompleteId).typeahead('destroy'); 

Die Sie $ ("#" reinizialize + autocompleteInfo.AutocompleteId)

+0

Vielen Dank. Ich möchte das typeahead-Steuerelement (oder zumindest das von typeahead verwendete Eingabeelement) nicht zerstören und neu erstellen, ein Grund dafür ist, dass ich kein richtiges Ereignis habe, wenn ich diese destroy/create-Operation machen möchte. Ich möchte für jedes Schlüsselwort, das durchsucht wird, ein Ereignis, wenn es zuvor gesucht wurde, eine Anfrage an den Server zu stellen. –

25

Fügen Sie einfach cache Feld remote Objekt:

remote: { 'cache': false ... }

+0

Das ist genau das, was ich brauchte. Ich hatte mehrere Bluthund-Engines, die an mehrere Texteingaben gebunden waren, wobei jede eine andere Liste von Benutzern nach Rollen bot (das ist ein Bissen). Nach Auswahl eines Benutzers aus einer der drei Texteingaben würden die anderen Eingaben die Liste der Benutzer anzeigen, die die erste Eingabe bereitgestellt hat. Das war eigentlich logisch falsch für meine Zwecke. Jedenfalls, danke Richard. – Dan

+2

Dies sollte als Antwort ausgewählt werden. Danke, Richard. – DerProgrammer

+0

Dies sollte definitiv die ausgewählte Antwort sein. Warum in aller Welt wurde diese Option unter "Remote" in der Dokumentation unter https://github.com/twitter/typeahead.js/blob/master/doc/bloodhound.md#remote nicht erwähnt –

0

Um IE Probleme zu beheben kam ich habe zu:

remote: { 
url: '/myurl?par=%QUERY', 
wildcard: '%QUERY', 
prepare: function (q, o) { 
     o.url = o.url.replace('%QUERY', encodeURIComponent(q)); 
     o.cache = false; 
     return o; 
    } 
} 

prefetch: { 
    url: '/myurl2', 
    ttl: 300000, //5min 
    thumbprint: userName, 
    prepare: function(o) { 
     o.cache = false; 
     return o; 
}