1

我是新手,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();  
}
4

2 回答 2

2

你是对的,这是inlineNav方法中的错误。线条

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

使用o.addParams.addRowParams.extraparam,但参数的默认值addParams(见这里)定义为addParams : {}而不是addParams : {addRowParams: {}}。所以表达式o.addParams.addRowParams是相等的undefined,与产生空引用异常o.addParams.addRowParams.extraparam的相同。undefined.extraparam

将相应的错误报告发布到 trirand,该问题将在 jqGrid 的下一个版本中修复。

作为一种解决方法,您可以替换该行

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

用线

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

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

  • 我强烈建议您始终使用gridview: true可以提高代码性能而没有任何缺点的选项
  • autoencode: true我建议您默认使用选项。默认情况下,jqGrid 将网格的输入数据解释为必须格式化的 HTML 片段。因此,如果您尝试显示数据a < b,可能会遇到问题,因为<它是 HTML 中的特殊字符。如果您使用autoencode: true选项,输入数据将被解释为文本而不是 HTML 片段。
  • 如果您始终为和属性index分配相同的值,我建议您从模型中删除属性。indexname
  • 我建议您为id输入数据的每个项目提供具有唯一值的属性。您应该了解 jqGrid总是为网格的每一行分配id属性。该值在页面上的所有 HTML 元素中必须是唯一的。如果您从服务器获取数据并且数据id在数据库中具有本机唯一性,则建议使用该值作为id属性值。如果您不指定任何id属性 jqGrid 分配值 1、2、3、... 作为行的 id 值(rowids)。如果您在页面上使用多个 jqGrids 并且不提供唯一id值,您将有 id 重复,这是 HTML 错误。
  • 我建议你使用idPrefixjqGrid 的选项。如果您在页面上有两个网格并且您没有为数据项填充(并且不需要)任何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
于 2013-04-19T06:44:05.970 回答
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;
?>
于 2013-05-10T18:19:51.390 回答