2017-11-20 1 views
0

HTML 코드를 반환하는 포맷터를 사용하여 셀 내에 작은 테이블 (HTML 테이블)을 정의하려고합니다. 콘텐츠는 동일한 레코드의 일부 숨겨진 필드를 기반으로합니다.setCell이 잘못된 셀을 업데이트합니다.

셀 내의 초기 설정은 잘 진행되고 있습니다. 문제는 나중에 "setCell"을 사용하여 숨겨진 필드를 수정하고 테이블 구조로 필드에 미치는 영향을 확인한다는 것입니다.

jqGrid가 WRONG 셀에 접근하여 일부 혼란을 일으키는 경우가 있습니다. 나는 그것을 증명할 jsFiddle을 만들었습니다.

jFiddle Example

당신이 볼 수 있듯이

<table id="grid"></table> 
<div> 
<input id="update" type="button" value="Update"> 
</div> 

var mydata = [{ 
    id: 1, 
    hiddenA: 1, 
    hiddenB: 2, 
    hiddenC: 4, 
    hiddenD: 8, 
    hiddenE: 16, 
    hiddenF: 32, 
    hiddenG: 64, 
    hiddenH: 128 
}]; 

$("#grid").jqGrid({ 
    datatype: "local", 
    data: mydata, 
    height: 250, 
    colNames: [ 
    'id', 
    'hiddenA', 
    'hiddenB', 
    'hiddenC', 
    'hiddenD', 
    'hiddenE', 
    'hiddenF', 
    'hiddenG', 
    'hiddenH', 
    'visibleA', 
    'visibleB' 
    ], 
    colModel: [ 
    {name: 'id', hidden: true, key: true}, 
    {name: 'hiddenA', hidden: true, width: 50}, 
    {name: 'hiddenB', hidden: true, width: 50}, 
    {name: 'hiddenC', hidden: true, width: 50}, 
    {name: 'hiddenD', hidden: true, width: 50}, 
    {name: 'hiddenE', hidden: true, width: 50}, 
    {name: 'hiddenF', hidden: true, width: 50}, 
    {name: 'hiddenG', hidden: true, width: 50}, 
    {name: 'hiddenH', hidden: true, width: 50}, 
    {name: 'visibleA', width: 80, formatter: addFormatter}, 
    {name: 'visibleB', width: 80, formatter: subFormatter} 
    ], 
    caption: "Table within a cell", 
    gridview: true, 
    loadonce: true, 
    viewrecords: true, 
    loadui: "disable", 
}); 

function addFormatter(cellvalue, options, rowObject) { 
    var ret = " \ 
    <table class='details-table'> \ 
    <tr><td>A+B:</td><td class='al-right'>{0}</td></tr> \ 
    <tr><td>B+C:</td><td class='al-right'>{1}</td></tr> \ 
    <tr><td>C+D:</td><td class='al-right'>{2}</td></tr> \ 
    <tr><td>D+A:</td><td class='al-right'>{3}</td></tr> \ 
    </table> \ 
    "; 
    ret = ret.replace("{0}", rowObject.hiddenA + rowObject.hiddenB); 
    ret = ret.replace("{1}", rowObject.hiddenB + rowObject.hiddenC); 
    ret = ret.replace("{2}", rowObject.hiddenC + rowObject.hiddenD); 
    ret = ret.replace("{3}", rowObject.hiddenD + rowObject.hiddenA); 

    return (ret); 
} 

function subFormatter(cellvalue, options, rowObject) { 
    var ret = " \ 
    <table class='details-table'> \ 
    <tr><td>E-F:</td><td class='al-right'>{0}</td></tr> \ 
    <tr><td>F-G:</td><td class='al-right'>{1}</td></tr> \ 
    <tr><td>G-H:</td><td class='al-right'>{2}</td></tr> \ 
    <tr><td>H-A:</td><td class='al-right'>{3}</td></tr> \ 
    </table> \ 
    "; 
    ret = ret.replace("{0}", rowObject.hiddenE - rowObject.hiddenF); 
    ret = ret.replace("{1}", rowObject.hiddenF - rowObject.hiddenG); 
    ret = ret.replace("{2}", rowObject.hiddenG - rowObject.hiddenH); 
    ret = ret.replace("{3}", rowObject.hiddenH - rowObject.hiddenE); 

    return (ret); 
} 

$("#update").bind("click", function() { 
    $("#grid").jqGrid("setCell", 1, "hiddenE", 256); 
    $("#grid").jqGrid("setCell", 1, "visibleB", "1"); 
}); 

는 "업데이트"버튼을 눌러 "hiddenE"필드를 변경 한 후 바로 업데이 트의 원인은 "visibleB"필드 접촉. 그러나 실제로는 "visibleA"필드가 수정되고 파괴된다는 것입니다.

아이디어가 있으십니까?

답변

0

사용중인 버전 4.6의 버그입니다. 문제는 setCell 메서드에서 업데이트하려는 셀 안의 테이블 셀의 경우입니다.

우리가 지원하는 구릿도 jqGrid에서도 동일한 문제가 지속됩니다. 우리는 GitHub에서 문제를 해결했으며 Guriddo jqGrid 제품을 사용하려는 경우이를 테스트 할 수 있습니다.

어떤 경우에는 다른 jqGrid 복제 제품으로 업그레이드 할 수없는 경우가 있습니다. 그 이유는이 "오래된"jqGrid 제품을 사용하지 마십시오.

자바 스크립트에 익숙하지 않은 경우 4.6 jqGrid 코드를 수정하여 사용하면됩니다.이 목적으로 jquery.jqGrid.js 파일 (축소되지 않은 파일)을 열고 setCell 메소드를 찾아야합니다. 라인 3646. 주위의 표현을

var tcell = $("td:eq("+pos+")",ind); 

을 찾은 다음이 파일을 작게를하고 사용할 수 있습니다

var tcell = ind.cells[pos]; 

로 교체하십시오.

이 경우 당신은 당신이 지원되는있는 jqGrid 클론 중 하나를 업그레이드 할 수 있습니다이 작업을 수행 할 수없는 경우 - 무료있는 jqGrid 또는 상업적 Guriddo있는 jqGrid

+0

당신의 대답 주셔서 감사합니다. 사실 버전 5.2.1이 설치되어 있습니다. 나는 관련 라인을 찾았고 실제로는 "var tcell = $ ("td : eq ("+ pos +") ", ind), cl = 0, rawdat = [];"입니다. 나는 아직 문제가 완전히 해결되지 않았다고 생각한다. – Udi

+0

제안 된 수정을 시도한 후에 실제로 올바른 셀이 업데이트되고 있습니다. 그러나 또 다른 문제는 Formatter에있는 "rowobject"매개 변수가 처음 (행 생성)과 다르게 동작한다는 것입니다. 첫 번째 호출에서는 필드가있는 멋진 객체입니다. "setCell"다음에는 필드없이 HTML 정보를 보유하는 목록 일뿐입니다. 그 이유가 뭐야? – Udi

+0

코드에서와 같이 사용자 정의 포맷터 함수를 정의 할 때 그리드가 포맷터에서 정의한 내용을 알지 못하므로 원래 데이터로 돌아가려면 사용자 정의 unformat 함수를 정의해야합니다. [Guriddo Documentation here] (http://www.guriddo.net/documentation/guriddo/javascript/user-guide/formatters/#custom-formatter)를 읽어 보시기 바랍니다. 또한 현재 setCell 코드에 작은 문제가 있음을 알아야합니다. 수정 사항은 내일 게시되며 다운로드 방법을 알려 드리겠습니다. –

관련 문제