[1984] javascript в yii
-
- Сообщения: 1428
- Зарегистрирован: 2009.08.20, 22:54
- Откуда: Молдова, Бельцы
- Контактная информация:
[1984] javascript в yii
Никак не могу понять, почему в yii перед всеми .live и .delegate не вызывается .die и .undelegate ?
Я сейчас работаю над ajax проектом, в котором используются CGridView, CListView,CActiveForm, и получается что если страница содержащая CGridView была загружена два и более раз, то ровно столько же обработчиков .live были на неё навешены. Решается это просто добавлением .die и .undelegate перед всеми вызовами типа .live
Я сейчас работаю над ajax проектом, в котором используются CGridView, CListView,CActiveForm, и получается что если страница содержащая CGridView была загружена два и более раз, то ровно столько же обработчиков .live были на неё навешены. Решается это просто добавлением .die и .undelegate перед всеми вызовами типа .live
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: javascript в yii
А как она может быть загружена несколько раз?
Нравится Yii? Давайте сделаем его лучше!.
-
- Сообщения: 1428
- Зарегистрирован: 2009.08.20, 22:54
- Откуда: Молдова, Бельцы
- Контактная информация:
Re: javascript в yii
Очень просто:
/js/ajax.js:
А все контроллеры уже от AjaxController идут. Все работает замечательно, но есть проблема с формами, CListView,CGridView так как не делается die перед live.
То есть ситуация возникает когда я со страницы А где есть gridView иду на страницу B, где опять же gridView, и выходит что live события дважды отработают.
P.S.: Может поправить этот момент в ядре yii ? Это здорово бы облегчило разработку ajax приложений.
Код: Выделить всё
class AjaxController extends CController
{
public function init()
{
Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl.'/js/ajax.js');
}
public function render($view, $data = null, $return = false) {
if(!Yii::app()->request->isAjaxRequest)
return parent::render($view, $data, $return);
else return $this->renderPartial ($view, $data, $return, true);
}
//put your code here
}
Код: Выделить всё
jQuery('a').live('click',function(){
jQuery('#content').load(jQuery(this).attr('href'));
return false;
})
То есть ситуация возникает когда я со страницы А где есть gridView иду на страницу B, где опять же gridView, и выходит что live события дважды отработают.
P.S.: Может поправить этот момент в ядре yii ? Это здорово бы облегчило разработку ajax приложений.
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: javascript в yii
Если это не ломает всё остальное — приму патчик.
Нравится Yii? Давайте сделаем его лучше!.
-
- Сообщения: 1428
- Зарегистрирован: 2009.08.20, 22:54
- Откуда: Молдова, Бельцы
- Контактная информация:
Re: javascript в yii
я подготовлю патч, но еще потестю его пару дней.
-
- Сообщения: 1428
- Зарегистрирован: 2009.08.20, 22:54
- Откуда: Молдова, Бельцы
- Контактная информация:
Re: javascript в yii
Подготовил патч. Проверил - пока все работает.
- Вложения
-
- live.rar
- патч
- (1 КБ) 234 скачивания
-
- Сообщения: 1428
- Зарегистрирован: 2009.08.20, 22:54
- Откуда: Молдова, Бельцы
- Контактная информация:
Re: javascript в yii
Есть несколько побочных действий после патча. Дополнительную привязку .live к элементам желательно(не для всех случаев) делать после того как вызваны соответствующие методы из фреймворка.
-
- Сообщения: 1428
- Зарегистрирован: 2009.08.20, 22:54
- Откуда: Молдова, Бельцы
- Контактная информация:
Re: javascript в yii
Последствия вот в чем - если хочешь повесить доп. обработчик кроме того что вешает yii, то придется это делать после того как yii его повесит. А плюсы - в простоте перевода всего приложения на ajax. Я как раз сейчас над таким компонентом работаю. Уже на 70% окончил его, и перевожу его в фазу тестирования. Я не думаю, что программист использующий CGridView перед его включением на страницу будет определять обработчик вида:
где id - id еще не определеного gridView.(то есть он еще неизвестен нам, и его использование абсурдно)
Однако этот конфликт легко разрешается с помощью изменения селекторов на допустим:
Как вариант чтоб избежать всяких проблем - можно передавать доп. параметр в CActiveForm, CGridView,CListView и CHtml::clientChange который отвечает за вызов die перед live, но опять же есть ли надобность в этом ? Ни могу представить себе ни одной задачи которая не решается если эта очистка обработчиков есть.
Код: Выделить всё
jQuery('#'+id+' .yiiPager a, #'+id+' .yiiGrid thead th a').live('click',function(){
})
Однако этот конфликт легко разрешается с помощью изменения селекторов на допустим:
Код: Выделить всё
jQuery('.yiiPager a,.yiiGrid thead th a').live('click',function(){
});
- samdark
- Администратор
- Сообщения: 9489
- Зарегистрирован: 2009.04.02, 13:46
- Откуда: Воронеж
- Контактная информация:
Re: javascript в yii
Нравится Yii? Давайте сделаем его лучше!.
-
- Сообщения: 1428
- Зарегистрирован: 2009.08.20, 22:54
- Откуда: Молдова, Бельцы
- Контактная информация:
Re: [1984] javascript в yii
Да, спасибо. С CActiveForm я не был уверен что не надо, делал на всякий случай )