Autor Zpráva
quatzael
Profil
Potřeboval bych nějak znovu předefinovat funkci nebo vlastnost (nevím přesně co to vlastně je).
Mám ve scriptu toto:

$('#autocomplete-input').autocomplete({
    lookup: values,
    lookupFilter: function (suggestion, originalQuery, queryLowerCase) {
    return suggestion.value.toLowerCase().indexOf(queryLowerCase) === 0;},
    autoSelectFirst: true,
    formatResult: function (suggestion, currentValue) {
    var reEscape = new RegExp('(\\' + ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'].join('|\\') + ')', 'g'),
        pattern = '^(' + currentValue.replace(reEscape, '\\$1') + ')';
    return suggestion.value.replace(new RegExp(pattern, 'gi'), '<strong>$1<\/strong>');
}
}); 

Jedná se o jquery našeptávač. Jenže bohužel funguje tak, že se po načtení stránky do položky lookup načte proměnná values a po změně proměnné values tam pořád zůstávají původní hodnoty. Jenže já potřebuju, aby se v našeptávači ty hodnoty měnily podle aktuálního stavu proměnné values.

Nové hodnoty získávám ajaxem, v tom manuálu je zmíněna položka onSearchStart, kde by snad mělo být možné aktualizovat položku lookup, ale zkoušel jsem to takto a nefunguje to:

/* PHP autocomplete_values.php vrací string: ['item1','item2','item3'] */

function getAutocompleteValues(){
var num = $('#another-input').val();
$.ajax({
url: "/autocomplete_values.php",    
type: "POST",        
data: {id: num},
success: function (response) {
return eval(response); 
}
});
}

$(document).ready(function(){
$('#autocomplete-input').autocomplete({
     onSearchStart: function (){$(this).autocomplete('setOptions', { lookup: getAutocompleteValues() });},
    lookupFilter: function (suggestion, originalQuery, queryLowerCase) {
    return suggestion.value.toLowerCase().indexOf(queryLowerCase) === 0;},
    autoSelectFirst: true,
    formatResult: function (suggestion, currentValue) {
    var reEscape = new RegExp('(\\' + ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\'].join('|\\') + ')', 'g'),
        pattern = '^(' + currentValue.replace(reEscape, '\\$1') + ')';
    return suggestion.value.replace(new RegExp(pattern, 'gi'), '<strong>$1<\/strong>');
}
}); 
}); 

Celý script našeptávače autocomplete je zde: jQuery Autocomplete

Tak mě napadlo nejsnadnější řešení, že bych celý to nadefinování našeptáváče nějak vždy znovu předefinoval, tedy zadal znovu :


$('#autocomplete-input').autocomplete({
/*aktuální obsah*/
}
}); 

Je to prosím nějak možné?
_es
Profil
quatzael:
Celý script našeptávače autocomplete je zde: jQuery Autocomplete
Je to prosím nějak možné?
Prečo si nepozrieš v dokumentácii k tomu „našepkávaču“, ako meniť jeho vlastnosti a správanie? Kedy to meniť vieš snáď sám - popísal si to v [#1].
quatzael
Profil
_es:
To jsem si četl, ale není tam nic použitelnýho.. A v ty ukázce vidíš, že to zkouším a nefunguje to..
_es
Profil
quatzael:
Snáď si tú dokumentáciu môžeš pozrieť nejako dôkladnejšie. Potrebuješ udalosť onSearchStart? Nepotrebuješ použiť nejakú udalosť čo nastane až po načítaní dát?

Jenže já potřebuju, aby se v našeptávači ty hodnoty měnily podle aktuálního stavu proměnné values.
„Našepkávač“ nemá nijaké možnosti, ako by mohol reagovať len na menenie nejakej premennej. Musíš pracovať s vlastnosťami, udalosťami a metódami „našepkávača“ podľa jeho dokumentácie.
quatzael
Profil
_es:
Snáď si tú dokumentáciu môžeš pozrieť nejako dôkladnejšie.
To bych rád, ale skoro nic v ní není. Jestli teda taky myslíš tuhle: Ajax AutoComplete for jQuery Je tam prd, nic se nedozvíš..

Potrebuješ udalosť onSearchStart? Nepotrebuješ použiť nejakú udalosť čo nastane až po načítaní dát?
Já nevím, ale připadá mi naprosto logický, abych načetl aktuální hodnoty před tím než začne našeptávač něco zobrazovat než potom..

Musíš pracovať s vlastnosťami, udalosťami a metódami ‚našepkávača‘ podľa jeho dokumentácie.
Ale jak? Je možný nějak obecným způsobem změnit nějakou vlastnost našeptávače třeba prostřednictvím úplně jiné funkce?
Davex
Profil
quatzael:
Je tam prd, nic se nedozvíš..
Já to tedy vidím poprvé v životě, ale proč nevycházíš z příkladu použití s AJAXem? Je s tím nějaký problém?
quatzael
Profil
Davex:
Vycházím, ale nefunguje to. Navíc to vypadá, že ten AJAX, který je zakomponován v tom našeptávači má fungovat tak (ale stejně nefunguje), že při každý změně v inputu se aktuální obsah inputu odešle ajaxem na server a odtamtud přijdou Suggestions.

To já ale stejně nechci.

Já mám řeším situaci s dvěma inputy A a B. Našeptávač pro input A je statický (hodnoty v lookup) a funguje. Jenže na základě toho co vyplní uživatel do inputu A, potřebuju aby se ten obsah inputu A odeslal na server a přišly odpovídající hodnoty pro našeptávání v inputu B.

Proto si chci celou tu záležitost s ajaxem vyřešit sám a jenom po získání aktuálních dat přepsat ty hodnoty v našeptávači pro input B.
_es
Profil
quatzael:
Tak si teda konečne zrozumiteľne popísal, čo vlastne chceš. V [#1] v druhom kóde: Ako si asi predstavuješ, že by mal fungovať príkaz return vo funkcii definovanej na 9., 10. a 11. riadku?
quatzael
Profil
_es:
V [#1] v druhom kóde: Ako si asi predstavuješ, že by mal fungovať príkaz return vo funkcii definovanej na 9., 10. a 11. riadku?
No nevím. Čekal bych, že ze stringu udělá skutečný pole a pošle ho tam odkud byla ta funkce volaná..

Já v javascriptu nejsem vůbec žádnej profík. Nevím přesně jak tyhle věci fungujou..
_es
Profil
quatzael:
Já v javascriptu nejsem vůbec žádnej profík.
Na to predsa nemusíš byť „profík“ to sú základné veci.

a pošle ho tam odkud byla ta funkce volaná..
A kam „tam“ by ho mala poslať?

Funkcia bude zavolaná (podľa dokumentácie jQuery) keď server vráti dáta, čo môže byť aj za dlhý čas, medzitým beží JS ďalej - to je to „A“ v skratke AJAX. Bráni ti snáď niečo zmeniť stav našepkávača v tej funkcii?
quatzael
Profil
_es:
A kam ‚tam‘ by ho mala poslať?
Tak konkrétně v tom scriptu je to řádek 17:
onSearchStart: function (){$(this).autocomplete('setOptions', { lookup: getAutocompleteValues() });},

Bráni ti snáď niečo zmeniť stav našepkávača v tej funkcii?
Já nevím jak. O to tady v celým vlákně jde! Vůbec nevím jak to změnit v tom našeptávači, tak zkouším všelijaký možnosti..
_es
Profil
quatzael:
Tak konkrétně v tom scriptu je to řádek 17:
Čo by to malo mať spoločné s tou inou funkciou? Akým záhadným spôsobom by sa malo predať eval(response) z 10. riadku do 17. riadku? Funkcia getAutocompleteValues ti vracia undefined a aj keby niečo vracala, tak by to nemalo zmysel, lebo vtedy ešte server nevrátil dáta.

Já nevím jak.
No predsa v tej funkcii z 9. riadku. Namiesto nezmyselného príkazu return.
quatzael
Profil
_es:
Ale já nevím jak.. To si tam můžu přímo znovu zadat celou tu definici naseptavace? Tzn. $('#autocomplete-input').autocomplete({... můžu zadávat pořád dokola a bude se to přepisovat s aktuálními daty?
_es
Profil
quatzael:
To si tam můžu přímo znovu zadat celou tu definici naseptavace?
To, ako máš pracovať s našepkávačom, máš predsa v jeho dokumentácii. Ty ho chceš používať, tak si to pozri. Nebude to tu študovať niekto, kto ho ani nemieni použiť. V 17. riadku sa predsa pokúšaš o nejaké jeho prenastavenie, tak ho použi v tej funkcii z 9. riadka. Samozrejme nie je zaručené, že zvyšok tvojho kódu neobsahuje podobné chyby.
quatzael
Profil
_es:
Já jsem psal, že v ty dokumentaci není skoro nic a to co tam je tak prostě nefunguje...
_es
Profil
quatzael [#15]:
Posledné rady sa ale predsa netýkali našepkávača, ale toho, že nevieš ani použiť AJAX.
Na otázku „To si tam můžu přímo znovu zadat celou tu definici naseptavace?“ máš odpoveď, daj „tam“ to, čo by tam podľa dokumentácie našepkávača bolo vhodné.
quatzael
Profil
_es:
máš odpoveď, daj ‚tam‘ to, čo by tam podľa dokumentácie našepkávača bolo vhodné.
Nemám, několikrát to tady už do nekonečna opakuju, že v dokumentaci je "h"! Není tam prostě nic, z čeho by se dalo usoudit jak to správně nastavit. Nevím už jak to líp napsat, že prostě dokumentace je k ničemu, a jakýkoli rady typu "pročti si dokumentaci" jsou mi na nic, protože to už jsem udělal několikrát a odpověď jsem tam nenašel..

Zkoušel jsem to takhle celý předefinovat, ale chová se to strašně divně (uvedeno v komentářích):

var values = ['Lucka','Simona','Dana','Linda','Lenka','Petra',];
$('#autocomplete-input').autocomplete({
    lookup: values,
  /* další věci */
}); 

/* když zadám do inputu "L", našeptávač zobrazí: 'Lucka','Linda','Lenka' */

/* po nějaké události proběhne tento kód: */
var newvalues = ['Rachel','Samantha','Ariana','Megan','Jennifer','Lily','Nicky'];
$('#autocomplete-input').autocomplete({
    lookup: newvalues,
  /* další věci */
}); 

/* po znovu zadání "L" do inputu, našeptávač zobrazí: 'Lily','Linda','Lenka' */
_es
Profil
quatzael [#17]:
Keď si zadefinoval novú premennú newvalues, nemal by si ju aj v 12. riadku použiť? Okrem toho, volanie s argumentom 'setOptions', čo si skúšal predtým, nefunguje?
quatzael
Profil
_es:
Sorry, jasně už jsem to opravil. Ale prostě se to chová tak, že ta první položka se z toho původního pole smaže a pole se zmergují.
'setOptions' nefunguje, protože se týká úplně jiných nastavení. Uvádí to i ta dokumentace..
_es
Profil
quatzael [#19]:
No a metódy našepkávača ako clear či dispose pred nastavením iného „našepkávania“?
quatzael
Profil
_es:
Clear maže jen Cache. Dispose nefunguje, protože je jen v dokumentaci, nikoliv v samotným scriptu..
_es
Profil
quatzael [#21]:
No tak v krajnom prípade môžeš zmazať celý element a vytvoriť ho znovu.
pcmanik
Profil
Vlákno sa už dosť rozrástlo a bez výsledku, tak nebolo by lepšie proste použiť iný našeptávač, ktorý má dobrú dokumentáciu?
quatzael
Profil
Vyřešeno. Stáhl jsem si jinou verzi autocomplete a tam už ten dispose je.
Díky za rady.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: