我是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();
}
答案 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
表达式等于undefined
,o.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片段。index
和index
属性分配的值相同,我建议您从模型中移除name
属性。id
属性。您应该了解jqGrid 总是为网格的每一行分配id
属性。该值必须对页面上的所有HTML元素都是唯一的。如果从服务器获取数据并且数据具有来自数据库的本机唯一id
,则建议将该值用作id
属性的值。如果未指定任何id
属性,则jqGrid将值1,2,3,...指定为行(rowid)的id值。如果您在页面上使用更多作为一个jqGrids并且不提供唯一的id
值,则您将具有ID错误,这是HTML错误。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;
?>