使用clientArray进行jqgrid内联保存会引发错误

时间:2013-04-19 02:37:17

标签: jqgrid save inline local

我是jqGrid的新用户,并创建了一个包含本地数据的简单网格,editurl设置为clientArray。我正在使用内联导航。我可以编辑一行,当我按下保存按钮时,行会更新。到目前为止一切都很好。

当我按下添加行按钮时,会插入一个新的空行。当我输入一些数据并单击保存按钮时,我收到错误消息:

Uncaught TypeError: Cannot read property 'extraparam' of undefined jquery.jqGrid.min.js:398

该文档仅说明应如何调用saveRow方法。但是,显然内联导航器会自动调用它。哪个是完美的。但我想我仍然需要正确设置一些参数,以便它不会抛出错误并保存新添加的行。

希望一些jqGrid大师有一个好的小费。感谢。

function createTable(data,colNames,colModel,caption ){
...

$(table).jqGrid({   data:data,
                        datatype: "local", 
                        height: 'auto', 
                        colNames:colNames,
                        pager:'#'+pagerid,
                        colModel:colModel, 
                        viewrecords: true, 
                        caption:caption,
                        editurl:'clientArray',
                        });


   var nav = $(table).jqGrid('navGrid','#'+pagerid,{edit:false,add:false,del:false});
   $(table).jqGrid('inlineNav','#'+pagerid);
   $(table).jqGrid('gridResize',{minWidth:350,maxWidth:800,minHeight:80, maxHeight:350});
   $('#gbox_'+tableid).draggable();  
}

2 个答案:

答案 0 :(得分:1)

你是对的,这是inlineNav方法中的一个错误。 The lines

if(!o.addParams.addRowParams.extraparam) {
    o.addParams.addRowParams.extraparam = {};
}

使用o.addParams.addRowParams.extraparam,但addParams参数的默认值(请参阅here)定义为addParams : {},而不是addParams : {addRowParams: {}}。因此,o.addParams.addRowParams表达式等于undefinedo.addParams.addRowParams.extraparam与生成空引用异常的undefined.extraparam相同。

我将the corresponding bug report发布到trirand,问题将在下一版jqGrid中修复。

作为解决方法,您可以替换

$(table).jqGrid('inlineNav','#'+pagerid);

$(table).jqGrid('inlineNav','#'+pagerid, {addParams: {addRowParams: {}}});

您的代码的一些常见附加说明:

  • 我严格建议您始终使用gridview: true选项,这样可以提高代码的性能而没有任何缺点
  • 我建议您默认使用autoencode: true选项。默认情况下,jqGrid将网格的输入数据解释为必须格式良好的HTML片段。因此,如果您尝试显示a < b之类的数据,则可能会出现问题,因为<是HTML中的特殊字符。如果您使用autoencode: true选项,输入数据将被解释为 text 而不是HTML片段。
  • 如果您为indexindex属性分配的值相同,我建议您从模型中移除name属性。
  • 我建议您为输入数据的每个项目提供具有唯一值的id属性。您应该了解jqGrid 总是为网格的每一行分配id属性。该值必须对页面上的所有HTML元素都是唯一的。如果从服务器获取数据并且数据具有来自数据库的本机唯一id,则建议将该值用作id属性的值。如果未指定任何id属性,则jqGrid将值1,2,3,...指定为行(rowid)的id值。如果您在页面上使用更多作为一个jqGrids并且不提供唯一的id值,则您将具有ID错误,这是HTML错误。
  • 我建议您使用jqGrid的idPrefix选项。如果页面上有两个网格,并且您没有为数据项填充(并且不需要)任何id,那么您有id重复项(id =“1”,id =“2”等)两个网格)。如果要为一个网格定义idPrefix: "g1_",为另一个网格定义idPrefix: "g2_"选项,则第一个网格的rowid将在第一个网格中为id =“g1_1”,id =“g1_2”等,并且id =第二个网格中的“g2_1”,id =“g2_2”。即使您从服务器填充id,然后在一个表中提供唯一ID,但来自两个数据库表的ID可以具有相同的ID。因此,对每个网格使用不同的idPrefix选项将以非常简单的方式解决id重复的问题。

答案 1 :(得分:0)

我遇到同样的问题,但我的jqgrid标记完全不同(可能是更新的版本?)

我可以使用内联编辑和保存行,但添加行不会保存。我不确定是什么问题。

<?php
ini_set("display_errors","1");
require_once 'jq-config.php';
// include the jqGrid Class
require_once ABSPATH."php/jqAutocomplete.php";
require_once ABSPATH."php/jqCalendar.php";
require_once ABSPATH."php/jqGrid.php";
// include the driver class
require_once ABSPATH."php/jqGridPdo.php";
// Connection to the server
$conn = new PDO(DB_DSN,DB_USER,DB_PASSWORD);
// Tell the db that we use utf-8
$conn->query("SET NAMES utf8");
// Create the jqGrid instance
$grid = new jqGridRender($conn);
// Write the SQL Query
$grid->SelectCommand = 'SELECT Serial, Type, Customer, Date, Notes FROM rmas';

$resize = <<<RESIZE
jQuery(window).resize(function(){
    gridId = "grid";

    gridParentWidth = $('#gbox_' + gridId).parent().width();
    $('#' + gridId).jqGrid('setGridWidth',gridParentWidth);
})
RESIZE;
$grid->setJSCode( $resize);

// set the ouput format to json
$grid->dataType = 'json';
$grid->table ="rmas";
$grid->setPrimaryKeyId("Serial");
// Let the grid create the model
$grid->setColModel();
// Set the url from where we obtain the data
$grid->setUrl('rmaform.php');
$grid->cacheCount = true;
//$grid->toolbarfilter = true;
$grid->setGridOptions(array(
    "caption"=>"RMAs",
    "rowNum"=>50,
    "sortname"=>"Serial",
    "hoverrows"=>true,
    "rowList"=>array(50,100,200),
    "height"=>600,
    "autowidth"=>true,
    "shrinkToFit"=>false
));


$grid->callGridMethod('#grid', 'bindKeys');
// Change some property of the field(s)
$grid->setColProperty("Serial", array("align"=>"center","width"=>40));
$grid->setColProperty("Type", array("align"=>"center","width"=>40));
$grid->setColProperty("Customer", array("align"=>"center","width"=>65));
$grid->setColProperty("Date", array("align"=>"center","width"=>40));
$grid->setColProperty("Notes", array("align"=>"left","width"=>500));
// navigator first should be enabled
$grid->navigator = true;
$grid->setNavOptions('navigator', array("add"=>false,"edit"=>false,"excel"=>true));
// and just enable the inline
$grid->inlineNav = true;
$buttonoptions = array("#pager", array(
        "caption"=>"Enable Cells", 
        "onClickButton"=>"js:function(){ jQuery('#grid').jqGrid('setGridParam',{cellEdit: true});}", "title"=> "Enable Excel like editing"
   )
);
$grid->callGridMethod("#grid", "navButtonAdd", $buttonoptions);
$buttonoptions = array("#pager", array(
        "caption"=>"Disable Cells", 
        "onClickButton"=>"js:function(){ jQuery('#grid').jqGrid('setGridParam',{cellEdit: false});}" , "title"=> "Disable Excel like editing"
   )
);
$grid->callGridMethod("#grid", "navButtonAdd", $buttonoptions);
$grid->renderGrid('#grid','#pager',true, null, null, true,true);
$conn = null;
?>