Кому-нибудь повезло с опцией beforeProcessing в jqGrid? - PullRequest
2 голосов
/ 31 января 2012

Я работаю над реализацией единого обработчика ошибок для удаленных методов cfc по модели Бена Наделя . Прежде чем перейти к этой точке, я просто возвращал объект данных в jqGrid в ожидаемой форме. Теперь я возвращаю объект ответа, который выглядит так:

RESPONSE.SUCCESS = "true/false"
RESPONSE.ERRORS = [array of errors]
RESPONSE.DATA = {normal data object that jqGrid expects}

Итак, теперь мне нужно помассировать объект ответа, когда он возвращается, чтобы у меня было

RESPONSE.SUCCESS == "true" 

обработчик, который, по крайней мере, отображает RESPONSE.DATA в объект данных, который ожидает jqGrid, а также

RESPONSE.SUCCESS == "false"

обработчик, который делает что-то еще. Моей первой мыслью было попытаться реализовать опцию beforeProcessing. Однако, если я добавлю это в мой код инициализации:

beforeProcessing: function(data, status, xhr) {
    console.log(data + ' beforeProcessing was called');
},...

ничего не регистрируется ни при инициализации, ни при последующих вызовах. Кроме того, если я вернусь к своему исходному коду и успешно перезагрузлю сетку, внутри

ничего не будет работать
beforeProcessing: function(){
    alert('hi');
    console.log('hi there');
},...

, который, казалось бы, указывает на то, что перед обработкой происходит сбой.

Если я не могу заставить это работать, я попытаюсь реализовать ajaxGridOptions {}, но не могу точно определить, что нужно установить там - я не нашел документации, которая бы мне сильно помогла .

1 Ответ

5 голосов
/ 31 января 2012

Я думаю, что есть недоразумение по поводу использования Ajax и загрузки сетки с сервера.Ajax использует внутренний протокол HTTP, который разделяет clear успешно отвечает из-за ответа error .Если сервер обнаружит какую-либо ошибку, он должен установить статус ошибки HTTP (см. здесь или здесь ).В случае кода состояния HTTP 400 и выше будет вызываться обратный вызов loadError вместо loadComplete.Формат ответа об ошибке может быть совершенно другим, как формат успешного ответа.

Поэтому я не вижу причин, по которым все блоки SUCCESS, DATA и ERRORS имеют.Логическое значение SUCCESS будет ясно из контекста: оно равно false внутри loadError и true внутри loadComplete.RESPONSE.DATA может быть непосредственно телом ответа.и RESPONSE.ERRORS может быть телом ответа об ошибке.

Это причина, по которой существуют и обратные вызовы loadError и loadComplete.

beforeProcessing будет вызываться только вслучай успешного ответа.Оператор console.log(data); не будет отображать необходимую информацию, потому что data будет объектом, а текст, такой как LOG: [object Object] beforeProcessing was called, который будет создан с помощью console.log(data + ' beforeProcessing was called');, получит немного информации.

ОБНОВЛЕНО: я не знаю ColdFusion, и это ограничение в обработке ошибок.Если вы действительно можете только в случае успеха вернуть данные типа

{
    "SUCCESS": true,
    "ERRORS": [],
    "DATA": {
        "TOTAL": xxx, 
        "PAGE": "yyy", 
        "RECORDS": "zzz",
        "ROWS": [
            {"ID": "id1", "CELL": ["cell11", "cell12", "cell13"]},
            {"ID": "id2", "CELL": ["cell21", "cell22", "cell23"]},
            ...
        ]
    }
}

и в случае ошибки

{
    "SUCCESS": true,
    "ERRORS": ["Any error description"],
    "DATA": {
    }
}

, тогда вы можете сделать следующее.

Прежде всего вы должны определить jsonReader опцию jqGrid, которая соответствует успешным данным:

jsonReader: {
    root: "DATA.ROWS",
    page: "DATA.PAGE",
    total: "DATA.TOTAL",
    records: "DATA.RECORDS",
    id: "ID"
}

Чтобы иметь возможность прочитать ответ об ошибке, вы можете поместить пустую часть "DATA" вответ внутри beforeProcessing:

beforeProcessing: function (data) {
    if (!data.SUCCESS) {
        // error response. we set empty "DATA"
        data.DATA = {TOTAL: 0, PAGE: 0, ROWS: []};

        // now the data.ERRORS should be processed
        alert (data.ERRORS.join(','));
    }
}

В реальном мире вы должны отображать сообщения об ошибках от data.ERRORS в некотором div или диалоге вместо использования alert, но общая схема, описанная выше, должнаработа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...