在另一个网格的行上单击重新加载struts2 Jquery Grid

时间:2013-01-23 13:36:41

标签: struts2 struts2-jquery struts2-jquery-grid

我的页面中有两个struts2 jQuery网格。我必须在第一个网格的行点击上加载第二个网格。我在第一个网格中添加了一个rowselect事件监听器,在该方法中我尝试重新加载网格。

$("#dgJobsDetailMain").jqGrid().trigger("reloadGrid");

我也试过触发Ajax请求

function populateJobRunDetails(jobName,dbSid)
{
    $.ajax({
        url: "ecmComparisonJobDetailDataAction?jobId="+jobName+"&selectedDbSid="+selectedDbSid+"&date="+new Date().getTime()+"&rowClicked=true",
        type: "GET",
        dataType: "json",
        success: function(data,textStatus,jqXHR)
        {
            //$("#dgJobsDetailMain").jqGrid().trigger("reloadGrid");
        },
        error:function(jqXHR, textStatus, errorThrown)
        {
            alert('error');
        }   
      }); 
}

我的问题是

  1. 每次操作都会多次执行Action的execute方法。当我在调试模式下运行应用程序时,我发现动作类的execute方法被调用了三次。其中,来自jsp页面的选定值被绑定到action类变量两次,第三次,值为null。
  2. 当我在ajax函数的success上触发重载网格事件时,动作类参数被设置为null,因此我无法继续进行数据提取。
  3. 第一个网格

    <sjg:grid viewrecords="true" formIds="ecmComparisonMainForm" reloadTopics="reloadDataGrid" pagerPosition="center" onSelectRowTopics="rowselect" id="dgJobsMain" caption="Job List" dataType="json"  href="%{ecmComparisonDataActionUrl}" pager="true"  
                gridModel="gridModel"  rowList="4,6,8" rowNum="5"  rownumbers="true" height="150" width="1200">        
                 <sjg:gridColumn name="jobId" index="jobId"  title="Job ID" hidden="true" />
                 <sjg:gridColumn name="jobName" index="jobName"  title="Job" sortable="true" />
                 <sjg:gridColumn name="jobDescription" index="jobDescription" title="Job Description"  sortable="true"/> 
                 <sjg:gridColumn name="database" index="database" title="Database" sortable="false" /> 
                 <sjg:gridColumn name="sourceSchema" index="sourceSchema" title="Source Schema" sortable="false"/> 
                 <sjg:gridColumn name="targetSchema" index="targetSchema" title="Target Schema" sortable="true"/>
                 <sjg:gridColumn name="prDescription" index="prDescription" title="PR Description" hidden="true" sortable="false"/>
                 <sjg:gridColumn name="createdDate" index="createdDate" title="Created Date" sortable="false"/>
                 <sjg:gridColumn name="createdBy" index="createdBy" title="Created By" sortable="false"/>
    </sjg:grid>
    

    行选择功能

    $.subscribe('rowselect', function(event, data) 
    {
        rowClicked = true;
        var grid = event.originalEvent.grid; 
        var sel_id = grid.jqGrid('getGridParam', 'selrow'); 
        var jobName = grid.jqGrid('getCell', sel_id, 'jobName');
    
        var dbSid = document.getElementById('schemaDbSid');
        $("#dgJobsDetailMain").jqGrid().trigger("reloadGrid");
        //populateJobRunDetails(jobName,dbSid.value);
    }
    );
    

    2nd Grid

    <sjg:grid pagerPosition="center" id="dgJobsDetailMain" caption="Job Details List" dataType="json"  href="%{ecmJobRunDetailsActionUrl}" pager="true"  
                gridModel="jobsDetailGridModel"  rowList="4,6,8" rowNum="5"  rownumbers="true" height="150" width="1200">        
                 <sjg:gridColumn name="runId" index="runId"  title="Run" sortable="true" />
                 <sjg:gridColumn name="startDate" index="startDate" title="Start Time"  sortable="true"/> 
                 <sjg:gridColumn name="endDate" index="endDate" title="End Time" sortable="false" /> 
                 <sjg:gridColumn name="status" index="status" title="Run Status" sortable="false"/> 
                 <sjg:gridColumn name="statusMsg" index="statusMsg" title="Status Details" sortable="true"/>
    </sjg:grid>
    

    动作类:

    //Form variables/getter setters
    
    public String execute()
    {
    // code to database
    }
    
    public String getJSON()
    {
    return execute();
    }
    

    请告诉我遗漏的内容。

4 个答案:

答案 0 :(得分:0)

在阅读完代码后,我猜你应该像这样重新加载网格。

var grid = jQuery("#yourGridId");
grid.trigger("reloadGrid");

答案 1 :(得分:0)

将属性reloadTopics添加到Grid并在需要时发布。这有一些好处再次普通触发reloadGrid。例如,formIds属性fas也受到尊重。

<sjg:grid id="myGrid" reloadTopics="reloadMyGridTopic" ... />

<script>
$.publish("reloadMyGridTopic");
</script>

答案 2 :(得分:0)

$("#dgJobsDetailMain").jqGrid('setGridParam',{url:'/context/action_name?param1='+value1+"&param2="+value2}).trigger("reloadGrid");

这解决了我的问题。 很奇怪,因为我和s:url and s:param尝试过同样的事情。它不起作用。

-Karthick

答案 3 :(得分:0)

试试这个:

      $.ajax({
            url: "myAction.action", cache: false, dataType: 'json', data: "Id=" +
                    Id,
            success: function (data) {
                var jsonData = JSON.stringify(data.jsonResponse);
                var parsedData = JSON.parse(jsonData);
                if (parsedData.hasResults) {
                    var myData = parsedData.jsonResults;
                    $(document).ready(function () {
                        var allParameters = $("#gridModel").jqGrid("getGridParam");
                        allParameters.data = myData;
                        $("#gridModel").trigger('reloadGrid');

                    });
                }
            } });

在ur action类中,将网格列表设置为json response:

jsonResponse = JsonResponses.collectionResponse(list);