FullCalendar - Bootstrap 模态加载 url 并填写输入字段
FullCalendar - Bootstrap Modal load url and fill inputs fields
当我点击一个空槽并打开一个 bootstrap modal
时,我需要他用日历中的日期填写表单输入字段,以创建一个新记录,这在事件 select
中工作正常在 shown.bs.modal
.
但是当我点击 eventClick
事件时,我只需要加载更新 url 中已有的表单。
但问题出在 eventClick
shown.bs.modal
中的代码也被触发并替换了字段。
modal(yii2框架)
<?php
Modal::begin([
'header' => '<b> NEW </b>',
'id' => 'modal',
'size' => 'modal-lg',
]);
echo "<div id='modalContent'></div>";
Modal::end();
?>
fullcalendar.js (3.10.0)
$('#calendar').fullCalendar({
defaultView: 'agendaDay',
locale: 'en-gb',
contentHeight: 'auto',
expandRows: true,
height: '100%',
header: {
left: 'prev,next',
center: 'title',
right: 'timelineDay,agendaDay'
},
groupByResource: true,
views: {
timelineDay: {
slotLabelFormat: ['HH:mm'],
},
},
weekends: false,
slotLabelFormat : "HH:mm",
minTime: "08:00:00",
maxTime: "17:00:00",
slotLabelInterval: "01:00:00",
slotDuration: '00:30:00',
slotWidth: "50",
slotEventOverlap: false,
selectable: true,
defaultDate: day,
selectOverlap: false,
displayEventTime: false,
select: function(start, end, jsEvent, view, resource) {
$('#modal')
.on('shown.bs.modal', function (e) {
$('#salas-date_begin').val(moment(start).format('YYYY-MM-DD HH:mm'));
$('#salas-date_end').val(moment(end).format('YYYY-MM-DD HH:mm'));
console.log('here!');
}).modal('show').find('#modalContent').load('http://url/create');
},
eventClick: function(event, jsEvent, view) {
$('#modal')
.modal('show').find('#modalContent').load('http://url/update?id=' + event.id);
},
schedulerLicenseKey: 'GPL-My-Project-Is-Open-Source',
resourceLabelText: 'Rooms',
events: events
});
更新所有视图
<?php
use kartik\export\ExportMenu;
use yii\bootstrap\Modal;
use yii\helpers\Html;
use yii\grid\GridView;
use yii\helpers\Json;
use yii\web\View;
use yii\widgets\Pjax;
/* @var $this yii\web\View */
/* @var $searchModel common\models\SalasSearch */
/* @var $dataProvider yii\data\ActiveDataProvider */
$this->title = Yii::t('app', 'Salas');
$this->params['breadcrumbs'][] = $this->title;
$this->registerJsFile('https://fullcalendar.io/releases/fullcalendar/3.10.0/lib/moment.min.js', ['depends' => [\yii\web\JqueryAsset::className()]]);
$this->registerJsFile('https://fullcalendar.io/releases/fullcalendar/3.10.0/fullcalendar.min.js', ['depends' => [\yii\web\JqueryAsset::className()]]);
$this->registerJsFile('https://fullcalendar.io/releases/fullcalendar-scheduler/1.9.4/scheduler.min.js', ['depends' => [\yii\web\JqueryAsset::className()]]);
$script2 = <<< JS
$(document).ready(function() {
$('#modal').on('hide.bs.modal', function (e) {
console.log($(e.currentTarget).off('shown.bs.modal')); // or $(this)
});
});
JS;
$this->registerJs($script2);
Modal::begin([
'header' => '<b> NEW </b>',
'id' => 'modal',
'size' => 'modal-lg',
]);
echo "<div id='modalContent'></div>";
Modal::end();
?>
<div class="salas-index">
<div class="row">
<div class="col-xs-12">
<div class="box">
<div class="box-body">
<link rel="stylesheet" href="https://fullcalendar.io/releases/fullcalendar/3.10.0/fullcalendar.min.css">
<link rel="stylesheet" href="https://fullcalendar.io/releases/fullcalendar-scheduler/1.9.4/scheduler.min.css">
<div id='calendar-container'>
<div id="calendar" class="fc fc-ltr fc-unthemed"></div>
</div>
</div>
</div>
</div>
</div>
</div>
<?php
$script = <<< JS
$('#calendar').fullCalendar({
defaultView: 'agendaDay',
locale: 'en-gb',
contentHeight: 'auto',
expandRows: true,
height: '100%',
header: {
left: 'prev,next',
center: 'title',
right: 'timelineDay,agendaDay'
},
groupByResource: true,
views: {
timelineDay: {
slotLabelFormat: ['HH:mm'],
},
},
weekends: false,
slotLabelFormat : "HH:mm",
minTime: "08:00:00",
maxTime: "17:00:00",
slotLabelInterval: "01:00:00",
slotDuration: '00:30:00',
slotWidth: "50",
slotEventOverlap: false,
selectable: true,
defaultDate: day,
selectOverlap: false,
displayEventTime: false,
select: function(start, end, jsEvent, view, resource) {
$('#modal')
.on('shown.bs.modal', function (e) {
$('#salas-date_begin').val(moment(start).format('YYYY-MM-DD HH:mm'));
$('#salas-date_end').val(moment(end).format('YYYY-MM-DD HH:mm'));
console.log('here!');
}).modal('show').find('#modalContent').load('http://url/create');
},
eventClick: function(event, jsEvent, view) {
$('#modal')
.modal('show').find('#modalContent').load('http://url/update?id=' + event.id);
},
schedulerLicenseKey: 'GPL-My-Project-Is-Open-Source',
resourceLabelText: 'Rooms',
events: events
});
JS;
$this->registerJs($script);
?>
那是因为一旦您单击日历中的日期,事件 shown.bs.modal
就会绑定以填写 start
和 end
dates.I 的输入第一次避免这样做。为什么?因为每次你 select 日期你都会再次绑定相同的事件而不删除前一个事件,这会影响性能并且也会有奇怪的行为。
相反,我会在 select
中使用 $.get
通过 controller/action 加载 form/view 并让所有输入都充满预加载值,然后按下 html 在模态里面。
在您的情况下,您目前可以做的是,一旦模式 window 在创建事件后关闭,您就可以取消绑定事件 shown.bs.modal
,因为当您单击时它将再次绑定在日期和 select
全日历事件发生时。
您应该在 document.ready
内的视图顶部注册它
/* First option */
$('#modal').on('hide.bs.modal', function (e) {
$(e.currentTarget).off('shown.bs.modal'); // or $(this)
});
注意:从 jQuery 3 开始,我正在使用 .off()
3 .unbind()
已弃用,取而代之的是 .off()
最重要的是你应该使用 yii 的可用扩展并集成完整的日历 https://www.yiiframework.com/extension/yii2fullcalendar and use event sources to load the events from the database. I have added an answer in past on the integration of the full calendar with the events modal from the database and filtering them 如果你想看的话。
当我点击一个空槽并打开一个 bootstrap modal
时,我需要他用日历中的日期填写表单输入字段,以创建一个新记录,这在事件 select
中工作正常在 shown.bs.modal
.
但是当我点击 eventClick
事件时,我只需要加载更新 url 中已有的表单。
但问题出在 eventClick
shown.bs.modal
中的代码也被触发并替换了字段。
modal(yii2框架)
<?php
Modal::begin([
'header' => '<b> NEW </b>',
'id' => 'modal',
'size' => 'modal-lg',
]);
echo "<div id='modalContent'></div>";
Modal::end();
?>
fullcalendar.js (3.10.0)
$('#calendar').fullCalendar({
defaultView: 'agendaDay',
locale: 'en-gb',
contentHeight: 'auto',
expandRows: true,
height: '100%',
header: {
left: 'prev,next',
center: 'title',
right: 'timelineDay,agendaDay'
},
groupByResource: true,
views: {
timelineDay: {
slotLabelFormat: ['HH:mm'],
},
},
weekends: false,
slotLabelFormat : "HH:mm",
minTime: "08:00:00",
maxTime: "17:00:00",
slotLabelInterval: "01:00:00",
slotDuration: '00:30:00',
slotWidth: "50",
slotEventOverlap: false,
selectable: true,
defaultDate: day,
selectOverlap: false,
displayEventTime: false,
select: function(start, end, jsEvent, view, resource) {
$('#modal')
.on('shown.bs.modal', function (e) {
$('#salas-date_begin').val(moment(start).format('YYYY-MM-DD HH:mm'));
$('#salas-date_end').val(moment(end).format('YYYY-MM-DD HH:mm'));
console.log('here!');
}).modal('show').find('#modalContent').load('http://url/create');
},
eventClick: function(event, jsEvent, view) {
$('#modal')
.modal('show').find('#modalContent').load('http://url/update?id=' + event.id);
},
schedulerLicenseKey: 'GPL-My-Project-Is-Open-Source',
resourceLabelText: 'Rooms',
events: events
});
更新所有视图
<?php
use kartik\export\ExportMenu;
use yii\bootstrap\Modal;
use yii\helpers\Html;
use yii\grid\GridView;
use yii\helpers\Json;
use yii\web\View;
use yii\widgets\Pjax;
/* @var $this yii\web\View */
/* @var $searchModel common\models\SalasSearch */
/* @var $dataProvider yii\data\ActiveDataProvider */
$this->title = Yii::t('app', 'Salas');
$this->params['breadcrumbs'][] = $this->title;
$this->registerJsFile('https://fullcalendar.io/releases/fullcalendar/3.10.0/lib/moment.min.js', ['depends' => [\yii\web\JqueryAsset::className()]]);
$this->registerJsFile('https://fullcalendar.io/releases/fullcalendar/3.10.0/fullcalendar.min.js', ['depends' => [\yii\web\JqueryAsset::className()]]);
$this->registerJsFile('https://fullcalendar.io/releases/fullcalendar-scheduler/1.9.4/scheduler.min.js', ['depends' => [\yii\web\JqueryAsset::className()]]);
$script2 = <<< JS
$(document).ready(function() {
$('#modal').on('hide.bs.modal', function (e) {
console.log($(e.currentTarget).off('shown.bs.modal')); // or $(this)
});
});
JS;
$this->registerJs($script2);
Modal::begin([
'header' => '<b> NEW </b>',
'id' => 'modal',
'size' => 'modal-lg',
]);
echo "<div id='modalContent'></div>";
Modal::end();
?>
<div class="salas-index">
<div class="row">
<div class="col-xs-12">
<div class="box">
<div class="box-body">
<link rel="stylesheet" href="https://fullcalendar.io/releases/fullcalendar/3.10.0/fullcalendar.min.css">
<link rel="stylesheet" href="https://fullcalendar.io/releases/fullcalendar-scheduler/1.9.4/scheduler.min.css">
<div id='calendar-container'>
<div id="calendar" class="fc fc-ltr fc-unthemed"></div>
</div>
</div>
</div>
</div>
</div>
</div>
<?php
$script = <<< JS
$('#calendar').fullCalendar({
defaultView: 'agendaDay',
locale: 'en-gb',
contentHeight: 'auto',
expandRows: true,
height: '100%',
header: {
left: 'prev,next',
center: 'title',
right: 'timelineDay,agendaDay'
},
groupByResource: true,
views: {
timelineDay: {
slotLabelFormat: ['HH:mm'],
},
},
weekends: false,
slotLabelFormat : "HH:mm",
minTime: "08:00:00",
maxTime: "17:00:00",
slotLabelInterval: "01:00:00",
slotDuration: '00:30:00',
slotWidth: "50",
slotEventOverlap: false,
selectable: true,
defaultDate: day,
selectOverlap: false,
displayEventTime: false,
select: function(start, end, jsEvent, view, resource) {
$('#modal')
.on('shown.bs.modal', function (e) {
$('#salas-date_begin').val(moment(start).format('YYYY-MM-DD HH:mm'));
$('#salas-date_end').val(moment(end).format('YYYY-MM-DD HH:mm'));
console.log('here!');
}).modal('show').find('#modalContent').load('http://url/create');
},
eventClick: function(event, jsEvent, view) {
$('#modal')
.modal('show').find('#modalContent').load('http://url/update?id=' + event.id);
},
schedulerLicenseKey: 'GPL-My-Project-Is-Open-Source',
resourceLabelText: 'Rooms',
events: events
});
JS;
$this->registerJs($script);
?>
那是因为一旦您单击日历中的日期,事件 shown.bs.modal
就会绑定以填写 start
和 end
dates.I 的输入第一次避免这样做。为什么?因为每次你 select 日期你都会再次绑定相同的事件而不删除前一个事件,这会影响性能并且也会有奇怪的行为。
相反,我会在 select
中使用 $.get
通过 controller/action 加载 form/view 并让所有输入都充满预加载值,然后按下 html 在模态里面。
在您的情况下,您目前可以做的是,一旦模式 window 在创建事件后关闭,您就可以取消绑定事件 shown.bs.modal
,因为当您单击时它将再次绑定在日期和 select
全日历事件发生时。
您应该在 document.ready
/* First option */
$('#modal').on('hide.bs.modal', function (e) {
$(e.currentTarget).off('shown.bs.modal'); // or $(this)
});
注意:从 jQuery 3 开始,我正在使用 .off()
3 .unbind()
已弃用,取而代之的是 .off()
最重要的是你应该使用 yii 的可用扩展并集成完整的日历 https://www.yiiframework.com/extension/yii2fullcalendar and use event sources to load the events from the database. I have added an answer in past on the integration of the full calendar with the events modal from the database and filtering them