Как избежать двойной привязки события?
У меня есть страница, содержащая многочисленные ссылки, которые приведут к открытию cjuidialog:
<?php foreach($client->assignments as $clientProjects) { ?>
[...]
<a href="javascript:void(0);"
id="attach_file_project_<?=$clientProjects['project_id']?>"
class="attach_timesheet_file"
data-id="<?=$clientProjects['project_id']?>"
data-week-start="<?=$client->clientWeek[0]?>"
data-week-end="<?=$client->clientWeek[6]?>"
>Attach File</a>
[...]
<?php } ?>
Это скрипт, который вызовет диалог. Содержимое диалога генерируется в вызове ajax:
$(".attach_timesheet_file").off('click').on("click", function(e) {
e.preventDefault();
$('#files-grid .delete').off('click');
var id = $(this).data("id");
var weekStart = $(this).data("week-start");
var weekEnd = $(this).data("week-end");
var url = "<?=Yii::app()->createUrl('admin/timesheetNew/attachTimesheet')?>";
$.ajax({
type: 'GET',
url:url + "?id=" + id + "&week_start=" + weekStart + "&week_end=" + weekEnd,
success: function(data) {
var modal = $("#attachFileModal");
modal.html(data);
modal.dialog('open');
return true;
}
})
});
Диалог позволяет добавлять и удалять файлы. Внутри диалога я использую виджет CGridView, который будет содержать ссылку для удаления:
$this->widget('zii.widgets.grid.CGridView', [
'id' => 'files-grid',
'dataProvider' => $dataProvider,
'columns' => [
[...]
[
'class' => 'CButtonColumn',
'template' => '{delete}',
'buttons' => [
'delete' => [
'label' => 'Delete',
'imageUrl' => null,
'url' => 'Yii::app()->createUrl("admin/timesheetNew/deleteFile", ["id" => $data["id"]])'
]
],
'deleteConfirmation' => 'Are you sure you want to delete this file?',
'afterDelete' => 'function(){
$("#files-grid").yiiGridView("update");
}'
]
]
]);
Проблема, с которой я сталкиваюсь, заключается в том, что когда я открываю, закрываю и снова открываю диалоговое окно и хочу удалить файл, мне нужно нажимать кнопку подтверждения столько раз, сколько я открывал диалоговое окно.
Я попытался с $(". Attach_timesheet_file"). Off('click'), который должен работать, чтобы отменить привязку события, но это не помогло, также пробовал то же самое для #files-grid .delete также не работал,
У кого-нибудь есть идея?
1 ответ
Мой подход - пометить новую привязку уникальным классом. Я уже думаю об использовании некоторого свойства набора данных, но добавление уникального класса выглядит проще в использовании. Кстати, проблема использования "off('click')" заключается в том, что вы отменяете любой другой щелчок, который у вас уже есть;
$('#filtro').not('.bindfiltro').change(function () {
$(this).submit();
}).addClass('bindfiltro');