Почему вынесение переменной за pjax влияет на работу DatePicker?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
i-programmer
Сообщения: 101
Зарегистрирован: 2015.08.24, 18:50

Почему вынесение переменной за pjax влияет на работу DatePicker?

Сообщение i-programmer »

Есть простой код:

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

    Pjax::begin(['id' => "test-grid-pjax", 'enablePushState' => false, 'enableReplaceState' => false]);
    
    echo GridView::widget([
    	'id' => "test-grid",
    	'dataProvider' => $dataProvider,
    	'filterModel' => $searchModel,
    	'columns' => $columns,
    ]);
    
    Pjax::end();
И есть определение колонок. Они вынесены в переменную:

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

  $columns = [
    	'id',
    	[
    		'attribute' => 'start_guarantee_period',
    		'value' => function ($model) {
    			return $model->start_guarantee_period;
    		},
    		'filter' => kartik\date\DatePicker::widget(['value' => $searchModel->start_guarantee_period, 'name' => 'ItemSearch[start_guarantee_period]', 'pluginOptions' => [
    				'format' => 'dd.mm.yyyy',
    				'todayHighlight' => true
    			],
    		]),
    	],
    ];
DatePicker используется от картика, то есть этот: https://demos.krajee.com/widget-details/datepicker . У DatePicker есть иконки выбора даты и сброса.


- Если инициализацию переменной $columns поместить внутрь Pjax, т.е. ПОСЛЕ тега Pjax::begin, то можно кликнуть иконку даты, выбрать дату, данные отфильтруются. Потом ещё раз нажать, выбрать дату, отфильтруются и т.д.
- Если инициализацию переменной $columns поместить за Pjax, т.е. ДО тега Pjax::begin, то можно выбрать дату только первый раз. После перезагрузки таблицы клик по иконкам не вызывают никаких событий. Просто мертвы.

Да, JS отваливается после перезагрузки контента. Да, можно это починить либо поместив $columns внутрь тега Pjax или после перезагрузки таблицы выполнить js код для перезапуска пикера:

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

$('#w0-kvdate').kvDatepicker(window.kvDatepicker_33d8ead7); 
---------

Но основной вопрос: почему такая магия происходит? Почему позиция переменной в конкретном выше коде PHP на сервере каким-то образом влияет на поведение JS? Я понимаю, если бы происходил echo переменной, а pjax буферизировал бы этот вывод и выводил после навешивания слушателей в JS. Но здесь всего лишь меняется позиция определения переменной.

Как влияет? Почему перестаёт работать?
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: Почему вынесение переменной за pjax влияет на работу DatePicker?

Сообщение masson »

А какая разница почему? Если понял как надо то делай и не парься :)
Скорее всего нажатие по кнопкам привязывается к конкретным айдишникам, а при каждом запросе они генерятся новые. Получается что ты сами инпуты с новыми айдишниками перерисовываешь, а js-код который к ним привязывается - нет. Посмотри в дебаггере что тебе в ответе приходит когда внутри инициализируешь и когда снаружи.
i-programmer
Сообщения: 101
Зарегистрирован: 2015.08.24, 18:50

Re: Почему вынесение переменной за pjax влияет на работу DatePicker?

Сообщение i-programmer »

masson писал(а): 2021.09.26, 02:19
Скорее всего нажатие по кнопкам привязывается к конкретным айдишникам, а при каждом запросе они генерятся новые.
Дело в том, что после перерисовки таблицы, если в консоли браузера выполнить код

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

$('#w0-kvdate').kvDatepicker(window.kvDatepicker_33d8ead7); 
то пикер будет опять работать, после выбора даты и перерендеривании таблицы если опять выполнить код, опять всё заработает и т.д. То есть айдишники не меняются абсолютно. Вот что интересно.


masson писал(а): 2021.09.26, 02:19 А какая разница почему? Если понял как надо то делай и не парься :)
Ну мне интересно почему. Это же не очевидная проблема. А костылять с JS кодом, как написал выше - идиотизм.. Проблема определённо из-за перезаписи и потери слушателя. Но не ясно как это вообще так влияет. Одно с другим же никак не связано. Я же не делаю echo $columns в какой-нибудь буфер, а просто перемещаю его перед pjax:begin или сразу после него. Как это вообще взаимосвязано со слушателями, перезагрузкой и вообще JS? Это же блин БЭК.
Ответить