Yii - jQuery не работает после renderPartial - PullRequest
5 голосов
/ 02 февраля 2012

Я знаю, что этот вопрос задавался много раз, и здесь, и на сайте Yii, но я не получаю решение даже после прохождения каждого решения. Я уверен, что я делаю что-то в корне неправильно. Так что, если вы все еще читаете это - здесь ничего не идет,

У меня есть страница с загружаемым виджетом CheckBoxList. У него есть вызов функции change () jQuery, который обновляет CGridView, который отлично работает. У меня также есть диапазон, связанный с каждым из элементов в checkBoxList, которые имеют событие click.

Это событие щелчка, в свою очередь вызывает контроллер, который «частично отображает» представление -

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


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

И соответствующий код виджета печатает CheckBoxList после извлечения $ data из базы данных.

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

Как видите, я поставил имя класса для каждого элемента, который будет отображаться как флажок, чтобы оно было modelFilter

Теперь у меня есть скрипт в файле основного вида, который просто отображает окно с предупреждением при нажатии флажка класса modelFilter.

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

Но, к сожалению, этого никогда не происходит.

Два общих решения, которые я прочитал на всех форумах:

a) Yii :: app () -> clientcript-> scriptMap ['jquery.js'] = false; , как вы можете видеть, я должным образом следовал.

b) Параметры $ result и $ processOutput объекта renderPartial должны иметь значение false и true соответственно. , что я тоже соблюдаю.

Таким образом, мой вопрос заключается в том, что мне нужно сделать, чтобы функция изменения содержимого, загружаемого через Ajax, работала в Yii !!

Ответы [ 4 ]

7 голосов
/ 02 февраля 2012

Если я правильно понимаю, вы звоните $('input.modelFilter').change() перед загрузкой списка флажков. При таком использовании обработчик событий не будет привязан ни к каким элементам, вставленным после вызова.

Вы должны использовать делегированные события вместо напрямую связанных событий. Взгляните на: http://api.jquery.com/on/ (поиск "Прямые и делегированные события")

$("body_or_input_container").on("change", "input.modelFilter", function(e){
    //callback
});
4 голосов
/ 02 ноября 2012

У меня была похожая проблема, после того, как я выполнил вызов Ajax, который возвратил частично визуализированный HTML с javascript внутри (автоматически созданный CActiveForm Yii), все было сломано, потому что больше не распознавался плагин jQuery.

После долгих исследований я обнаружил, что эта часть снова отправляет библиотеку jQuery, и она реинициализирует себя, «забывая» все, что было инициализировано ранее (особенно другие плагины, в моем случае диалоговое окно пользовательского интерфейса). Единственным исправлением было указание Yii не включать сам jQuery.js в составную часть, но разрешить включать другие файлы JS.

Итак, поместите это в начало части.

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

Обратите внимание, что вы должны настроить загрузку jQuery один раз при загрузке страницы.

0 голосов
/ 07 мая 2014

В случае eye renderPartial он уничтожает существующий объект javascript

например

У меня есть форма с проверкой петрушки j, она отлично работает, когда мы используем render (), но не распознаетпредмет петрушки.поэтому нам нужно снова инициализировать объект, в моем случае это было

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

0 голосов
/ 02 февраля 2012

ОК, в решении, которое я нашел, будь оно случайно, нужно было включить сценарий jQuery для частично визуализированного файла в сам частично визуализированный файл.

Я хочу знать, правильный ли этот стиль.

...