Сталкиваюсь уже не первый раз с проблемой, которая довольно часто поднимается, но тем не менее я лично так и не понял, каков наиболее корректный способ её решения.
Пишу админку, в которой многие части интерфейса загружаются через AJAX-вызовы и renderPartial, например есть такое меню:
По клику на ссылку "Отзывы на рассмотрении" в правой части загружается грид (TbExtendedGridView из YiiBooster, но не суть важно):
В гриде в свою очередь: кнопки view/update загружают диалоги (CJuiDialog), а кнопки Bulk соответственно призваны выполнять bulk-операции.
Проблема состоит в том, что каждый клик на ссылке "Отзывы на рассмотрении" приводит к увеличению числа js-handlers на всех кнопках. Т.е. новые хэндлеры создаются, а старые не удаляются.
Таким образом каждый клик по кнопкам в гриде приведёт сначала к 2-м запросам, потом к 3-м и так далее.
Текущий код кнопок в гриде:
Код: Выделить всё
$viewDialog =<<<'EOT'
function() {
var url = $(this).attr('href');
$.get(url, function(r){
$("#viewDialog").html(r).dialog("open");
});
return false;
}
EOT;
$updateDialog =<<<'EOT'
function() {
var url = $(this).attr('href');
$.get(url, function(r){
$("#updateDialog").html(r).dialog("open");
});
return false;
}
EOT;
...
'buttons'=>array(
'view' => array(
'icon' => 'view',
'label' => 'View',
'url' => 'Yii::app()->createUrl("/admin/productfeedback/view", array("id"=>$data->id))',
'click'=>$viewDialog,
),
'update' => array(
'icon' => 'view',
'label' => 'View',
'url' => 'Yii::app()->createUrl("/admin/productfeedback/update", array("id"=>$data->id))',
'click'=>$updateDialog,
),
),
...
По факту это относится вообще ко всему контенту, загружаемому AJAX-ом: например сами ссылки "Отзывы на рассмотрении" и т.п. у меня также загружаются асинхронно при переходе в пункт "Отзывы" вышестоящего меню и при повторной загрузке клики на них также приводят к дуплицированию запросов...
Заранее благодарен за любую помощь!