jqgrid - устанавливает значение custom_value для edittype: 'custom' - PullRequest
4 голосов
/ 05 августа 2010

Значение custom_value для place_id устанавливается в зависимости от того, какую строку я щелкаю первой. Последующие строки, по которым щелкнули, будут использовать одно и то же значение независимо от их действительного значения. Почему?

пример:

place_id foo_name bar_value
   10      blah       abc
   11      blah2      fgr

щелкните по строке с place_id, равным 10, и нажмите «изменить», и в появившейся форме будет 10 для значения place_id. Внесите изменения и сохраните их, затем нажмите следующую строку вниз. Форма по-прежнему будет иметь значение place_id 10, хотя все остальные значения будут правильными.

Мой код:

Столбец place_id выглядит так:

{name:'place_id', index:'place_id', editable: true, edittype:'custom',
 editoptions: { custom_element:myelem,custom_value:myval }}

Функция myval:

function myval(elem){
    return elem.val();
}

Мне нужно, чтобы myval был установлен на правильный place_id для редактируемой строки. Я посмотрел на объект elem в Firebug и вижу, что он всегда имеет значение в зависимости от того, какая строка была нажата первой, но я не понимаю, почему и при этом я не вижу, откуда можно получить правильное значение. Любые предложения приветствуются (я пытался спросить на форумах jqgrid, но ничего не получилось, поэтому я перехожу к stackoverflow).

* Редактировать: если я использую edittype:'text' вместо edittype:'custom', я получаю правильные значения, отображаемые и передаваемые, но тогда столбец редактируется, и он должен быть только видимым, но не редактируемым.

Полный код:

jQuery(document).ready(function(){ 
    jQuery("#list").jqGrid({
        url:'/foo/bar/results',
        datatype: 'json',
        mtype: 'POST',
        colNames:['Place ID', 'Site ID', 'Site Name', 'API ID', 'M Type'],
        colModel :[ 
            {name:'place_id', index:'place_id', key: true, sorttype:'integer',
             width:70, editable: true, edittype:'custom',
             editoptions: {custom_element:myelem,custom_value:myval }},
            {name:'site_id', index:'site_id', sorttype:'integer', width:70,
             editable: true, edittype: 'select', editrule: {required: true},
             editoptions:{value:getSites(), size:30}},
            {name:'site_name', index:'site_name', width:150, editable: false,
             editrule: {required: true}, editoptions: {size:30}},
            {name:'api_id', index:'api_id', sorttype:'integer', width:75,
             editable: true, edittype: 'text', editrules: {required: true},
             editoptions:{size:30}},
            {name:'m_type', index:'m_type', width:150, editable: true,
             edittype: 'select', editrules: {required: true},
             editoptions:{value:{'one':'one','two':'two','three':'three',
                                 'four':'four'},size:30}} 
        ],
        editurl:'/foo/bar/editinfo',    
        height: 'auto',
        width: 'auto',
        pager: '#pager',
        viewrecords: true,
        loadonce: true,
        rowNum:20,
        rowList:[20,40,60,80,100],
        caption: 'Meter Listing'
    }); 

    // Edit functionality
    $("#editfields").click(function(){
        var gr = jQuery("#list").jqGrid('getGridParam','selrow');
        if( gr != null ) { 
            jQuery('#list').setGridParam({datatype:'json'});
            jQuery("#list").jqGrid('editGridRow',gr,
                           {editCaption: 'Edit Place Details',height:550,
                            closeAfterEdit:true,width:600,reloadAfterSubmit:true});
        } else {
            alert("Please select a row");
        }
    });
});

function myelem(value,options){
    return $('<input type="text" value="'+value+'" disabled="disabled"/>');
}

function myval(elem){
    return elem.val();
}

edit2:

getSites:

function getSites(){
    <?php
    $sites = "0:Select";
    foreach ($this->sites as $k => $v){
        $sites = $sites . ";" . $v['site_id'] . ":" . $v['site_name'];
    }
    ?>
    return "<?= $sites ?>";
}

1 Ответ

5 голосов
/ 05 августа 2010

Не могли бы вы попытаться включить key: true в определение столбца place_id. Вы можете удалить id из данных, которые вы отправляете с сервера.

Если это не поможет, вы должны опубликовать полный пример кода, который воспроизводит вашу проблему, и я постараюсь найти обходной путь.

ОБНОВЛЕНО : Иногда есть простое решение для сложных проблем. Один дополнительный параметр функции editGridRow решит вашу проблему:

recreateForm: true

Без использования параметра функция myelem будет вызываться только один раз при первом редактировании выбранной строки . Тогда форма будет кэширована и не воссоздана . Таким образом, вы будете редактировать всегда одну и ту же строку. После включения параметра recreateForm: true форма будет создаваться каждый раз .

Кстати, я установил некоторые общие настройки, которые я использую во всех jqGrids для расширения jQuery.jgrid.defaults, jQuery.jgrid.edit, jQuery.jgrid.view, jQuery.jgrid.del и jQuery.jgrid.nav. Например я всегда использую

jQuery.extend(jQuery.jgrid.edit, {
    closeAfterAdd: true,
    closeAfterEdit: true,
    recreateForm: true,
   //...
});

Тогда мне не нужно устанавливать эти параметры позже. Во время написания ответа Добавьте несколько элементов ввода в поле пользовательского типа редактирования о пользовательском редактировании. У меня также есть настройки, поэтому я не увидел никаких проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...