Как настроить функцию doubleClick для вызова пользовательской функции в jqGrid - PullRequest
0 голосов
/ 19 ноября 2011

Я добавил пользовательский элемент управления кнопкой редактирования в навигатор jqGrid следующим образом:

jQuery("#grid").navButtonAdd('#pager',
    {  
     caption:"Edit", 
     buttonicon:"ui-icon-pencil", 
     onClickButton: editSelectedRow,
     position: "last", 
     title:"click to edit selected row", 
     cursor: "pointer",
     id: "edit-row"
    } 
  );

Чтобы вместо использования функции по умолчанию: editGridRow, она использовала мою пользовательскую функцию editSelectedRow. Однако я также хочу добавить функцию doubleClick, чтобы она вызывала editSelectedRow для doubleClick.

с использованием функции editGridRow по умолчанию работает как таковой

ondblClickRow: function()
      {
       var rowid = jQuery("#grid").jqGrid('getGridParam','selrow');
       jQuery(this).jqGrid('editGridRow', rowid);
      }

Однако, когда я заменяю функцию editGridRow по умолчанию на мою функцию по умолчанию editSelectedRow как таковую,

ondblClickRow: function()
      {
       var rowid = jQuery("#grid").jqGrid('getGridParam','selrow');
       jQuery(this).jqGrid('editSelectedRow', rowid);
      }

Я получаю следующую ошибку в firebug:

uncaught exception: jqGrid - No such method: editSelectedRow

Однако функция editSelectedRow существует и работает с нажатием пользовательской кнопки редактирования. Пожалуйста, помогите, спасибо.

UPDATE : @Oleg: Как и требовалось, вот метод определения кода: editSelectedRow

function editSelectedRow(rowid)
{
    var rowid = jQuery("#grid").jqGrid('getGridParam','selrow');
    if( rowid != null ) 
    {
        var dialogId = '#edit-form-dialog';
        var dialogTitle = 'Edit Customer';

        $(dialogId).load('/customer/edit/id/' + rowid, function () 
        {
            $(this).dialog(
            {
                modal: false,
                resizable: true,
                minWidth: 650,
                minHeight: 300,
                height: $(window).height() * 0.95,
                title: dialogTitle,
                buttons: 
                    {
                    "Save": function () 
                        {
                        var form = $('form', this);
                        $(form).submit();
                        $("#grid").trigger("reloadGrid");
                    },
                    "Cancel": function () 
                    {
                        $("#grid").trigger("reloadGrid");
                        $(this).dialog('close');
                    }
                }
          });

            LaunchEditForm(this);
        });
    }
    else
    {
        jQuery( "#dialogSelectRow" ).dialog();
    }
    return false;
 }

@ Олег: Спасибо, вы не рекомендовали использовать собственный метод editSelectedRow вместо метода editGridRow. Я использую это потому, что мои формы Zend Forms и мне нужны все навороты Zend Form. Сервер генерирует эту форму и загружается в диалоговую форму. Если есть способ достичь этого, не прибегая к моему пользовательскому методу editSelectedRow, я был бы рад изучить его. Благодарю.

1 Ответ

3 голосов
/ 21 ноября 2011

Ваш вопрос - чистый вопрос JavaScript.

Если вы определите функцию editSelectedRow как

function editSelectedRow(rowid)
{
    ...
}

Вы можете назвать его как editSelectedRow(rowid), а не как jQuery(this).jqGrid('editSelectedRow', rowid);.

Другая проблема заключается в том, что вы используете this внутри тела функции editSelectedRow. Это не правильно. Вы можете определить editSelectedRow функцию немного по-другому

var editSelectedRow = function (rowid) {
    ...
};

В случае editSelectedRow сможет связать this с любым значением. Для этого вам нужно использовать другую форму вызова функции. Внутри ondblClickRow будет

ondblClickRow: function () {
    var rowid = jQuery("#grid").jqGrid('getGridParam','selrow');
    editSelectedRow.call(this, rowid);
}

В приведенном выше примере первый параметр call - это значение, используемое как this внутри функции. Мы пересылаем только текущее значение this на editSelectedRow. Если бы мы использовали форму editSelectedRow(rowid); для вызова функции, значение this внутри функции будет инициализировано как window object.

Использование editSelectedRow внутри navButtonAdd может остаться без изменений.

...