有一个简单的代码:
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
从 kartik 使用,即这个
有DatePicker
日期选择器和重置图标。
- 如果变量的初始化
$columns
放在Pjax中,即 在标签之后Pjax::begin
,您可以点击日期图标,选择一个日期,数据将被过滤。然后再次单击,选择日期,过滤掉等。 - 如果变量的初始化
$columns
放在Pjax后面,即 在标签之前Pjax::begin
,您只能选择第一次的日期。重新加载表格后,单击图标不会触发任何事件。刚死。
是的,JS 在内容重新加载后脱落。是的,您可以通过将$columns
其放置在标签内Pjax
或重新加载表格后,执行 js 代码$('#w0-kvdate').kvDatepicker(window.kvDatepicker_33d8ead7);
重新启动选取器来修复它。
主要问题是:为什么会发生这种魔术?为什么服务器上上述特定PHP代码中变量的位置会以某种方式影响JS的行为?我知道如果有一个echo
变量,它会在JSpjax
中挂起监听器后缓冲这个输出和输出。但在这里它只是改变了变量定义的位置。它如何影响?为什么它停止工作?
一切都非常简单。当你取出
Columns
forpjax
,然后也连接在里面DatePicker
,那么所有loadable for它的工作都会在js-скрипты
连接之前</body>
。并且
css-селекторы
它们都注册在特定的类中。正如您自己所写的那样-在
pjax
一切正常之后,bind
这些类将消失,因为它们实际上将从 . 消失DOM
,然后它们将再次添加到那里,但没有bind
. 但是如果你Columns
在初始化之后插入,Pjax
那么在每次加载内容后,它的操作所需要的一切js-скрипты
都会重新连接,pjax
因为<script scr="></script>
它会在 -container 中注册,因此,将再次调用pjax
初始化,并且所有的类都在-script 将再次挂起。datepicker
js
bind
所以要么你仍然把它转移到
$columns
里面pjax
- 要么kartik
重写 -ovskyjs
on :)bind
body