2012-02-02 26 views
5

Sé que esta pregunta se ha realizado numerosas veces, tanto aquí como en el sitio Yii, pero no estoy obteniendo la solución incluso después de pasar por cada solución. Estoy seguro de que estoy haciendo algo fundamentalmente equivocado. Entonces, si todavía está leyendo esto, aquí nada,Yii - jQuery no funciona después de renderPartial

Tengo una página que tiene cargado un widget CheckBoxList. Tiene una llamada de función jQuery change() que refresca un CGridView que funciona perfectamente. También tengo un lapso relacionado con cada uno de los elementos en checkBoxList que tienen un evento de clic.

Este evento de clic, a su vez llama a un controlador que "hace parcialmente" una vista -

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


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

Y el código del widget correspondiente imprime una CheckBoxList después de ir a buscar $ datos de la db.

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

Como se puede ver, he puesto el nombre de clase para cada elemento que se representa como una casilla de verificación para ser modelFilter

Ahora tengo un script en el archivo principal objeto de mostrar sólo un cuadro de alerta cuando se hace clic en la casilla de verificación del modelo modelFilter.

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

Pero, por desgracia, esto nunca sucede.

Las dos soluciones comunes que he leído en todos los foros es

a) Yii :: aplicación() -> clientscript-> ScriptMap [ 'jquery.js'] = false; que puede ver que he seguido debidamente.

b) $ result y $ processOutput Los parámetros del renderPartial son falsos y verdaderos, respectivamente., que también es algo que he seguido.

Así que mi pregunta es ¿qué debo hacer para obtener la función de cambio en un contenido que se carga a través de Ajax funcionando, en Yii !!

+0

Por lo que yo entiendo ... ¿el evento click también dispara una solicitud AJAX? Si este es el caso, ¿podría verificar si hay un jQuery JavaScript incluido en la respuesta? Si es así, esto puede reiniciar su jQuery y arruinar su lógica de JavaScript, aunque debería poder deshabilitar esto configurando processOutput en 'false'. – schmunk

Respuesta

7

Si entiendo correctamente, está llamando al $('input.modelFilter').change() antes de cargar la lista de casillas de verificación. Utilizado de esta forma, el controlador de eventos no estará ligado a ningún elemento insertado después de la llamada.

Debe usar eventos delegados en lugar de eventos directamente enlazados. Echar un vistazo a: http://api.jquery.com/on/ (búsqueda de "directo y eventos delegadas")

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

Parece prometedor. ¡Déjeme verificar esto y responderle! ¡Gracias por la respuesta! –

+0

¡Hombre, usted es un salvador! –

0

OK, en la solución que encontré, ya sea accidentalmente, era incluir el script jQuery para el archivo parcialmente procesado, en el archivo parcialmente renderizado.

Sin embargo, quiero saber si este estilo es correcto.

+0

Pero no creo que esta sea una muy buena solución. ¡Ni siquiera puedo actualizar el gridView que se encuentra en la página de vista principal! :( –

4

tuve un problema similar, Después de realizar una llamada Ajax, que devuelve un código HTML procesado parcial con javascript dentro de (auto generada por CActiveForm de Yii) todo se rompió porque ya no se reconoció el complemento jQuery.

Después de una larga investigación encontré que el parcial está enviando la jQuery lib nuevamente y se reinicializa "olvidando" todo lo que se ha inicializado antes (especialmente otros complementos, en mi caso el diálogo UI). La única solución fue decirle a Yii que no incluyera el jQuery.js en el parcial pero dejara incluir otros archivos JS.

Pon esto al comienzo del parcial.

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

Tenga en cuenta que debe configurar para cargar el jQuery una vez en la carga de la página.

+0

Muchas gracias, tuve el mismo problema. Fue muy difícil de depurar. Yii es un marco extraño. – Magicode

0

En caso de ojo renderPartial se destruye el objeto existente de JavaScript

por ejemplo

Tengo una forma con la validación de perejil j funciona perfectamente cuando usamos render(), pero no reconoce el objeto perejil . entonces necesitamos reinicializar el objeto nuevamente en mi caso fue

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