Yii CGridView - установить обратный вызов afterAjaxUpdate по умолчанию

Кто-нибудь знает, как установить функцию по умолчанию в CGridView, которая будет запускаться во всех сетках на странице после каждого обновления AJAX? Я использую CGridView на многих страницах и не хочу указывать эту функцию для каждой сетки отдельно. Мне это нужно, потому что я использую jQuery selectmenu для раскрывающихся списков фильтров, и после перезагрузки AJAX им нужно для повторной инициализации.

'afterAjaxUpdate' => "function(id,data){$('select').selectmenu()}";

person Asped    schedule 04.11.2013    source источник


Ответы (2)


См. формат значения http://www.yiiframework.com/doc/api/1.1/CGridView#afterAjaxUpdate-detail

функция javascript, которая будет вызываться после получения успешного ответа AJAX. Сигнатура функции — это функция (идентификатор, данные), где «идентификатор» относится к идентификатору представления сетки, а «данные» — к полученным данным ответа ajax.

Вам нужно установить

'afterAjaxUpdate' => "function(id,data){$('select').selectmenu()}";

ОБНОВЛЕНО:

Я не вижу другого способа, кроме как создать дочерний элемент CGridView и установить значение $afterAjaxUpdate. Вот код:

class GridView extends CGridView{
    public $afterAjaxUpdate = "function(id,data){$('select').selectmenu()}";
}

ОБНОВЛЕНО:

Я смотрю исходный код виджета и свойство afterAjaxUpdate используется только в методе registerClientScript. Вот почему я предлагаю другое решение. Во-первых, вы можете изменить значение afterAjaxUpdate в инициализации унаследованного класса:

public function init(){
    parent::init(); // after setting all values reset value to desire
    $this->afterAjaxUpdate = "function(id,data){$('select').selectmenu()}";
  }

Во-вторых, вы можете изменить его правильно перед вызовом метода registerClientScript:

public function registerClientScript(){
    $this->afterAjaxUpdate = "function(id,data){$('select').selectmenu()}";
    parent::registerClientScript();
  }
person CreatoR    schedule 04.11.2013
comment
Дело не в формате, я обновлю свой вопрос... Проблема не в этом. Проблема в том, что мне это нужно для каждого возможного GridView в качестве настройки по умолчанию. - person Asped; 04.11.2013
comment
Хм, это была бы хорошая идея, но тогда, если мне нужно добавить еще какую-то функциональность в одну конкретную сетку, я снова потеряю эту функцию по умолчанию. - person Asped; 04.11.2013
comment
Два ваших предложения по-прежнему делают то же самое. Неважно, настроили ли вы его в свойстве, или в init, или даже в registerClientScript. На самом деле это решение УДАЛИТ любой другой код, который обычно может быть назначен в представлениях, использующих GridView. - person Asped; 05.11.2013

После дополнительных исследований я обнаружил, что на самом деле невозможно установить функцию afterAjaxUpdate по умолчанию, которая автоматически запускалась бы для всех представлений сетки.

Однако есть 2 возможности, которые можно использовать:

  1. См. ответ от CreatoR — установите событие по умолчанию в расширенном объекте GridView. Это работает до тех пор, пока никто вручную не устанавливает afterAjaxUpdate в определенной сетке.

  2. Вы можете изменить (но это не очень хороший способ «расширения») файл jquery.yiigridview.js в соответствии с этими конкретными потребностями, добавив новый option=function, что-то вроде '* **afterAjaxUpdateDefault*'** и поместите его до или после вызова 'afterAjaxUpdate'.

person Asped    schedule 04.11.2013