복붙노트

[JQUERY] 무료있는 jqGrid에 remapColumnsByName와 remapColums를 교체하는 방법

JQUERY

무료있는 jqGrid에 remapColumnsByName와 remapColums를 교체하는 방법

해결법


  1. 1.우선 예전의 대답에 설명 된 코드가 항상 정확하지 작동하는지 언급하고 싶다. 당신은 그리드를 다시로드하기 전에 예 및 용도 열 선택기 여러 번에 하나의 행 선택 데모를 열 수있는 문제를 설명합니다. 예를 들어, 당신은 첫 번째 열 선택기와 "세금"열 후 "고객"열 변경 위치를 열 수 있습니다. 당신은 그리드에서 올바른 결과를 볼 수 있습니다. 그런 다음 한 번 더 열 선택기를 열고 예를 들어, "고객"열 후 "날짜"열을 이동할 수 있습니다. 당신은 순서 "양", "세금", "클라이언트", "날짜"의 열을 볼 수 있습니다 ... 이제 페이지를 다시로드 할 수 있습니다. 당신은 리로디드 페이지를 열 잘못된 순서가 있음을 볼 수 있습니다 : "클라이언트", "양", "세금", "날짜"... 문제의 이유 : 위치 정수 용도 열 선택기 또는 remapColumns에서 사용하는 순열 상대적으로 열 현재 주문에 열입니다. 그것은 열 순서의 절약은 더 복잡합니다. 하나는 원래 colModel의 재 배열로 원래의 열 순서 항상 다시 계산합니다 순열 배열의 값을 유지해야합니다.

    우선 예전의 대답에 설명 된 코드가 항상 정확하지 작동하는지 언급하고 싶다. 당신은 그리드를 다시로드하기 전에 예 및 용도 열 선택기 여러 번에 하나의 행 선택 데모를 열 수있는 문제를 설명합니다. 예를 들어, 당신은 첫 번째 열 선택기와 "세금"열 후 "고객"열 변경 위치를 열 수 있습니다. 당신은 그리드에서 올바른 결과를 볼 수 있습니다. 그런 다음 한 번 더 열 선택기를 열고 예를 들어, "고객"열 후 "날짜"열을 이동할 수 있습니다. 당신은 순서 "양", "세금", "클라이언트", "날짜"의 열을 볼 수 있습니다 ... 이제 페이지를 다시로드 할 수 있습니다. 당신은 리로디드 페이지를 열 잘못된 순서가 있음을 볼 수 있습니다 : "클라이언트", "양", "세금", "날짜"... 문제의 이유 : 위치 정수 용도 열 선택기 또는 remapColumns에서 사용하는 순열 상대적으로 열 현재 주문에 열입니다. 그것은 열 순서의 절약은 더 복잡합니다. 하나는 원래 colModel의 재 배열로 원래의 열 순서 항상 다시 계산합니다 순열 배열의 값을 유지해야합니다.

    또한 하나의 캔 대신 원래 열 모델에 상대적으로 변경된 컬럼 위치에 배열의 열 이름을 저장합니다. 즉 하나는 사용자에게 마지막 시간을 choosed 할 그리드에서 열 이름의 배열 cmOrder 같은 것으로 columnsState의 순열 속성을 교체해야합니다.

    메소드 remapColumnsByName은 매우 간단합니다. 이 메소드 remapColumns처럼 작동하지만, 그 첫 번째 매개 변수는 열 이름의 배열 대신 정수 인덱스의 배열입니다.

    데모는 빠르고 columnsState에 cmOrder 속성 대신 순열 속성을 사용하는 데모를 선택하고 추가 메소드 remapColumnsByName를 사용하도록 단일 행의 변경 더럽습니다. 나는 내 대답의 시작 부분에 설명 된 것처럼 같은 테스트를 반복한다면 당신은 새로운 데모가 내가 전에 설명하는 버그가없는 것을 볼 수 있습니다.

    아래 찾을 원래 데모 다른 데모의 가장 중요한 부분 :

    var getColumnNamesFromColModel = function () {
            var colModel = this.jqGrid("getGridParam", "colModel");
            return $.map(colModel, function (cm, iCol) {
                // we remove "rn", "cb", "subgrid" columns to hold the column information 
                // independent from other jqGrid parameters
                return $.inArray(cm.name, ["rn", "cb", "subgrid"]) >= 0 ? null : cm.name;
            });
        },
        saveColumnState = function () {
            var p = this.jqGrid("getGridParam"), colModel = p.colModel, i, l = colModel.length, colItem, cmName,
                postData = p.postData,
                columnsState = {
                    search: p.search,
                    page: p.page,
                    rowNum: p.rowNum,
                    sortname: p.sortname,
                    sortorder: p.sortorder,
                    cmOrder: getColumnNamesFromColModel.call(this),
                    selectedRows: idsOfSelectedRows,
                    colStates: {}
                },
                colStates = columnsState.colStates;
    
            if (postData.filters !== undefined) {
                columnsState.filters = postData.filters;
            }
    
            for (i = 0; i < l; i++) {
                colItem = colModel[i];
                cmName = colItem.name;
                if (cmName !== "rn" && cmName !== "cb" && cmName !== "subgrid") {
                    colStates[cmName] = {
                        width: colItem.width,
                        hidden: colItem.hidden
                    };
                }
            }
            saveObjectInLocalStorage(myColumnStateName(this), columnsState);
        },
        ...
    

    또한 열의 순서를 복원 loadComplete 콜백는 다음과

    loadComplete: function () {
        var $this = $(this), p = $this.jqGrid("getGridParam"), i, count;
    
        if (firstLoad) {
            firstLoad = false;
            if (isColState && myColumnsState.cmOrder != null && myColumnsState.cmOrder.length > 0) {
                // We compares the values from myColumnsState.cmOrder array
                // with the current names of colModel and remove wrong names. It could be
                // required if the column model are changed and the values from the saved stated
                // not corresponds to the 
                var fixedOrder = $.map(myColumnsState.cmOrder, function (name) {
                        return p.iColByName[name] === undefined ? null : name;
                    });
                $this.jqGrid("remapColumnsByName", fixedOrder, true);
            }
            if (typeof (this.ftoolbar) !== "boolean" || !this.ftoolbar) {
                // create toolbar if needed
                $this.jqGrid("filterToolbar",
                    {stringResult: true, searchOnEnter: true, defaultSearch: myDefaultSearch});
            }
        }
        refreshSerchingToolbar($this, myDefaultSearch);
        for (i = 0, count = idsOfSelectedRows.length; i < count; i++) {
            $this.jqGrid("setSelection", idsOfSelectedRows[i], false);
        }
        saveColumnState.call($this, this.p.remapColumns);
    },
    

    나는 새로운 데모의 코드가 멀 완벽한 있음 반복합니다. 난 그냥 예전의 코드를 사용하고 무료있는 jqGrid에서 작업하고 새로운 remapColumnsByName 방법을 사용하여 만들기 위해 그것을 해결했습니다.

  2. from https://stackoverflow.com/questions/31641594/how-to-replace-remapcolums-with-remapcolumnsbyname-in-free-jqgrid by cc-by-sa and MIT license