52 messaggi dal 04 ottobre 2011
Salve a tutti, ho il seguente problema.
Ho creato un plugin per Jquery che inrealtà ingloba il plugin autocomplete (per far apparire quando si digita in una textbox un menu a tendina con varie suggestioni). I dati dell'autocomplete provengono da un webservice che interroga le tabelle dei comuni nel mio DB. Fin qui tutto ok.

Il problema è:

Ho inserito nel plugin una singola opzione, un flag booleano che mi indica se inserire o meno i comuni esteri nel risultato. Se passo come parametro un semplice 'true' o 'false' funziona tutto.
Quello che vorrei fare è passare come opzione una FUNZIONE che in base al fatto che l'oggetto chiamante abbia o meno una certa classe Css invii true o false.
Siccome varie textbox utilizzano questo sistema, utilizzo un selettore di classe come oggetto Jquery per la funzione . per intenderci :

 $('.txtcomuni').autocompleteComuni(options) 


Ora, se provo a passare una funzione nelle options, in pratica per TUTTE le textbox che utilizzano il plugin ritorna lo stesso parametro, indipendentemente dal fatto che l'oggetto abbia o meno l'altra classe che uso come discriminante.

Vi posto il codice :

PLUGIN
(function ($) {
    $.fn.autocomplete_comuni = function (options) {
        var opts = $.extend({}, $.fn.autocomplete_comuni.defaults, options);
        return this.each(function () {
            $(this).autocomplete({
                source: function (request, response) {
                    var f = opts.flagEsteri ? "A" : "I"; //a=tutti, i=italiani
                    $.ajax({ url: 'GetComuni.asmx/GetComuniFormattati',
                        data: "{ 'input': '" + request.term + "', 'flagNaz' : '" + f + "', 'maxResult' : '10' }",
                        dataType: "json",
                        type: "POST",
                        contentType: "application/json; charset=utf-8",
                        success: function (data) { response(data.d) },
                        error: function (XMLHttpRequest, textStatus, errorThrown) {
                            alert('Errore Javascript);
                        }
                    });
                },
                minLength: 1,
                select: function () {
                    $(this).attr('readOnly', 'readOnly').next().show(); 
                 } 
            });
        });
    }
    $.fn.autocomplete_comuni.defaults = { flagEsteri: true }
})(jQuery)



questo è il codice che utilizzo nella pagina :


  $('.txtcomuni').autocomplete_comuni({ flagEsteri: function () {
                $(this).hasClass('comuniIta'); 
            } });



grazie!
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao, sì ho incontrato questo problema anch'io ma non sono sicuro di riuscire a spiegarlo bene. Un bel pomeriggio mi sono accorto che non avevo capito niente di come funzionano le closures in javascript, perciò ti mando due link :)
http://www.selfcontained.us/2009/01/23/scoping-javascript-closures-in-loops/
http://www.mennovanslooten.nl/blog/post/62

Nel tuo codice non vedo la funzione di cui parli ma sono quasi sicuro che per risolvere il problema tu debba "inoltrarla" come argomento alla funzione .autocomplete.

$(this).autocomplete({
    source: ...,
    minLength: ...,
    select: ...,
    flagEsteri: opts.flagEsteri //qui "passi" all'autocomplete il riferimento alla funzione
}


Poi, dal corpo della funzione che hai assegnato a source, devi andarti a leggere la proprietà func ed eseguire la funzione. Credo che tu possa farlo con il metodo option ma non ti so indicare la sintassi precisa. Forse così? Mmmh.
var flagEsteri = $(this).autocomplete("option", "flagEsteri");
var risultato = flagEsteri($(this));

Però dovresti modificare la funzione così:
$('.txtcomuni').autocomplete_comuni({ flagEsteri: function (elemento) {
                elemento.hasClass('comuniIta'); 
}});


Può darsi che esistano soluzioni più semplici. Ad esempio, non sarebbe sufficiente passare il nome della classe o il selettore a cui l'elemento deve essere conforme, anziché passare una funzione?


ciao
Modificato da BrightSoul il 28 giugno 2012 21.39 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.