[1984] javascript в yii

Уже исправленные репорты или принятые предложения
Закрыто
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

[1984] javascript в yii

Сообщение Ekstazi »

Никак не могу понять, почему в yii перед всеми .live и .delegate не вызывается .die и .undelegate ?
Я сейчас работаю над ajax проектом, в котором используются CGridView, CListView,CActiveForm, и получается что если страница содержащая CGridView была загружена два и более раз, то ровно столько же обработчиков .live были на неё навешены. Решается это просто добавлением .die и .undelegate перед всеми вызовами типа .live
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: javascript в yii

Сообщение samdark »

А как она может быть загружена несколько раз?
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: javascript в yii

Сообщение Ekstazi »

Очень просто:

Код: Выделить всё

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
}
 
/js/ajax.js:

Код: Выделить всё

jQuery('a').live('click',function(){
    jQuery('#content').load(jQuery(this).attr('href'));
    return false;
})
 
А все контроллеры уже от AjaxController идут. Все работает замечательно, но есть проблема с формами, CListView,CGridView так как не делается die перед live.

То есть ситуация возникает когда я со страницы А где есть gridView иду на страницу B, где опять же gridView, и выходит что live события дважды отработают.
P.S.: Может поправить этот момент в ядре yii ? Это здорово бы облегчило разработку ajax приложений.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: javascript в yii

Сообщение samdark »

Если это не ломает всё остальное — приму патчик.
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: javascript в yii

Сообщение Ekstazi »

я подготовлю патч, но еще потестю его пару дней.
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: javascript в yii

Сообщение Ekstazi »

Подготовил патч. Проверил - пока все работает.
Вложения
live.rar
патч
(1 КБ) 234 скачивания
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: javascript в yii

Сообщение Ekstazi »

Есть несколько побочных действий после патча. Дополнительную привязку .live к элементам желательно(не для всех случаев) делать после того как вызваны соответствующие методы из фреймворка.
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: javascript в yii

Сообщение Ekstazi »

Последствия вот в чем - если хочешь повесить доп. обработчик кроме того что вешает yii, то придется это делать после того как yii его повесит. А плюсы - в простоте перевода всего приложения на ajax. Я как раз сейчас над таким компонентом работаю. Уже на 70% окончил его, и перевожу его в фазу тестирования. Я не думаю, что программист использующий CGridView перед его включением на страницу будет определять обработчик вида:

Код: Выделить всё

jQuery('#'+id+' .yiiPager a, #'+id+' .yiiGrid thead th a').live('click',function(){
})
 
где id - id еще не определеного gridView.(то есть он еще неизвестен нам, и его использование абсурдно)
Однако этот конфликт легко разрешается с помощью изменения селекторов на допустим:

Код: Выделить всё

jQuery('.yiiPager a,.yiiGrid thead th a').live('click',function(){
});
 
Как вариант чтоб избежать всяких проблем - можно передавать доп. параметр в CActiveForm, CGridView,CListView и CHtml::clientChange который отвечает за вызов die перед live, но опять же есть ли надобность в этом ? Ни могу представить себе ни одной задачи которая не решается если эта очистка обработчиков есть.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: javascript в yii

Сообщение samdark »

Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: [1984] javascript в yii

Сообщение Ekstazi »

Да, спасибо. С CActiveForm я не был уверен что не надо, делал на всякий случай )
Закрыто