2012-02-02 17 views
5

So che questa domanda è stata posta numerose volte, sia qui che nel sito Yii, ma non ottengo la soluzione anche dopo aver esaminato ciascuna soluzione. Sono sicuro che sto facendo qualcosa di fondamentalmente sbagliato. Quindi, se stai ancora leggendo questo - qui non va nulla,Yii - jQuery non funziona dopo renderPartial

Ho una pagina che ha un widget CheckBoxList caricato. Ha una chiamata alla funzione jQuery change() che aggiorna un CGridView che funziona perfettamente. Ho anche una span relativa a ciascuno degli elementi nella checkBoxList che hanno un evento click.

Questo evento click, a sua volta chiama un controllore, che "rende parzialmente" una visione -

Yii::app()->clientscript->scriptMap['jquery.js'] = false; 


$this->widget('ext.xxx.EModelWidget', array(
'name' => $widget_name, 
'manufacturer_id' => $manufacturer_id, 
    ) 
); 

E il codice del widget corrispondente stampa un CheckBoxList dopo il recupero $ dati dal db.

echo CHtml::checkBoxList($this->name, array(), $data, array(
     'class' => 'modelFilter', 
     'separator' => '', 
     'template' => '<div>{input} {label}</div>', 
     'id' => 'dummyID', 
    )); 

Come potete vedere, ho messo il nome della classe per ogni elemento che verrà visualizzato come una casella di controllo per essere modelFilter

Ora ho uno script nel file vista principale per visualizzare solo una finestra di avviso quando si fa clic sul checkbox di class modelFilter.

Yii::app()->clientScript->registerScript('model-selected', " 
$('input.modelFilter').change(function(){ 
    alert('Hellpo!'); 
    }); 
"); 

Ma sfortunatamente, questo non succede mai.

Le due soluzioni comuni che ho letto in tutti i forum è

a) Yii :: app() -> clientscript-> ScriptMap [ 'jquery.js'] = false; che puoi vedere che ho debitamente seguito.

b) I parametri $ result e $ processOutput di renderPartial devono essere falsi e veri rispettivamente., che è anche qualcosa che ho seguito.

Quindi la mia domanda è cosa devo fare per ottenere la funzione di modifica su un contenuto che viene caricato tramite Ajax funzionante, in Yii !!

+0

Per quanto ho capito ... l'evento click genera anche una richiesta AJAX? In questo caso, potresti verificare se nella risposta c'è un jQuery JavaScript incluso? Se è così, questo potrebbe reinizializzare il tuo jQuery e rovinare la tua logica JavaScript, anche se dovresti essere in grado di disabilitarlo impostando processOutput su 'false'. – schmunk

risposta

7

Se ho capito bene, chiami $('input.modelFilter').change() prima di caricare l'elenco delle caselle di controllo. Utilizzato in questo modo il gestore eventi non sarà associato a nessun elemento inserito dopo la chiamata.

È necessario utilizzare eventi delegati anziché eventi direttamente associati. Date un'occhiata a: http://api.jquery.com/on/ (ricerca per "diretto ed eventi delegati")

$("body_or_input_container").on("change", "input.modelFilter", function(e){ 
    //callback 
}); 
+0

Sembra promettente. Fammi controllare e torna da te! Grazie per la risposta !! –

+0

Uomo, sei un salvatore! –

0

OK, sulla soluzione che ho trovato, sia accidentalmente, è stato quello di includere lo script jQuery per il file parzialmente renderizzato, nel file parzialmente reso stesso.

Voglio sapere se questo stile è corretto, però.

+0

Ma non trovo che questa sia un'ottima soluzione. Non riesco nemmeno ad aggiornare il gridView che si trova nella pagina di visualizzazione principale !! :( –

4

ho avuto un problema simile, dopo aver eseguito una chiamata Ajax, che ha restituito un HTML parziale reso con javascript all'interno (auto generato da CActiveForm di Yii) tutto è stato interrotto perché nessun plugin jQuery è stato riconosciuto più.

Dopo una lunga ricerca ho scoperto che il partial sta inviando di nuovo il jQuery lib e si reinizializza "dimenticando" tutto ciò che è stato inizializzato in precedenza (specialmente altri plugin, nel mio caso la finestra di dialogo dell'interfaccia utente). L'unica correzione era di dire a Yii di non includere jQuery.js stesso nel partial ma di includere altri file JS.

Quindi mettere questo all'inizio del parziale.

Yii::app()->clientscript->scriptMap['jquery.js'] = false; 

Nota che è necessario configurare per caricare il jQuery una volta al caricamento della pagina.

+0

Grazie mille, ho avuto lo stesso problema. È stato molto difficile eseguire il debug. una strana struttura. – Magicode

0

In caso di occhio renderPartial distrugge l'oggetto esistente di javascript

esempio

Ho una forma con la convalida del j prezzemolo funziona perfettamente quando usiamo render(), ma non riconosce l'oggetto prezzemolo . quindi è necessario reinizializzare nuovamente l'oggetto nel mio caso era

$ ("# form"). prezzemolo();