Как обрабатывать обновления ячеек таблицы данных Dojo, чтобы я мог автоматически публиковать их на сервере? - PullRequest
2 голосов
/ 23 апреля 2010

Я использую таблицу данных dojo для отображения моих данных. Когда конечный пользователь редактирует значения ячейки, она должна обновляться на сервере с помощью вызовов ajax (когда фокус выходит из ячейки).

Иначе, у меня должны быть кнопки Редактировать и обновить / отменить для каждой строки, чтобы обрабатывать одну и ту же функцию. Но я не знаю, как поместить кнопки редактирования и обновления в сетку и фиксировать их события.

По умолчанию dojo обновляет только локальное значение хранилища (на стороне клиента). как сохранить обновленные значения ячеек на сервере?

нам нужно написать какие-либо методы переопределения, чтобы сделать это ??

Я новичок в додзё. Любое подробное объяснение или примеры кодов будет высоко ценится.

Может ли кто-нибудь протянуть руку, чтобы решить эту проблему?

Спасибо

С уважением, Радж

Ответы [ 3 ]

4 голосов
/ 06 мая 2010

Чтобы иметь возможность выдвигать обновления на стороне сервера, вы должны переопределить _saveCustom() или _saveEverything(). Вот фрагмент кода (немного очищенный), который я использую, чтобы сохранить обновление.

Обратите внимание, что приведенный ниже код основан на закрытом _getModifiedItems(), поскольку DataGrid принимает встроенные выпуски. Если вы знаете список измененных элементов (поскольку издание выполняется во всплывающем окне и вы храните ключ элемента где-то), получить измененный элемент проще.

module.submitUpdates = function() {
    var store = <from a variable local to the module>
    if (store.isDirty() confirm("Updates to be persisted. Continue?")) {
        store._saveCustom = function(saveCompleteCallback, saveFailedCallback) {
            var modifiedItem = _getModifiedItems(store)[0];
            dojo.xhrPost( {
                headers: { "content-type": "application/json; charset=utf-8" },
                content: dojo.toJson(modifiedItem),
                handleAs: "json",
                load: function(response) {
                    if (response !== null && response.success) {
                        saveCompleteCallback();
                    }
                    else {
                        saveFailedCallback(response);
                    }
                },
                error: saveFailedCallback,
                url: "/API/<Object>"
            });
        };
        store.save( {
            onComplete : function() {
                module.loadCachingRuleList();
            },
            onError : function(errorData, request) {
                _reportUpdateFailure(errorData, errMsg);
            }
        });
    }
};

Вот код, который я использую, чтобы получить все обновленные элементы, когда пользователь собирается потерять обновленную DataGrid (потому что он покидает страницу или потому что он хочет обновить содержимое сетки).

Обратите внимание, что следующий код использовал Dojo 1.3. Я не проверял, проще ли с Dojo 1.4 ... Я надеюсь, что dojo.Stateful, который будет представлен в Dojo 1.5, упростит его, иначе нам придется ждать Dojo 1.6;)

var _getModifiedItems = function(store) {
    var modifiedItems = [];
    if (store !== null && store._pending !== null) {
        if (store._pending._modifiedItems !== null) {
            for (var modifiedItemKey in store._pending._modifiedItems) {
                if (store._itemsByIdentity) {
                    modifiedItems.push(store._itemsByIdentity[modifiedItemKey]);
                }
                else {
                    modifiedItems.push(store._arrayOfAllItems[modifiedItemKey]);
                }
            }
        }
        if (store._pending._newItems !== null) {
            for (var modifiedItemKey in store._pending._newItems) {
                if (store._itemsByIdentity) {
                    modifiedItems.push(store._itemsByIdentity[modifiedItemKey]);
                }
                else {
                    modifiedItems.push(store._arrayOfAllItems[modifiedItemKey]);
                }
            }
        }
    }
    return modifiedItems;
};

var _getDeletedItems = function(store) {
    var deletedItems = [];
    if (store !== null && store._pending !== null && store._pending._deletedItems !== null) {
        for (var deletedItemKey in store._pending._deletedItems) {
            if (store._itemsByIdentity) {
                deletedItems.push(store._itemsByIdentity[deletedItemKey]);
            }
            else {
                deletedItems.push(store._arrayOfAllItems[deletedItemKey]);
            }
        }
    }
    return deletedItems;
};

Надеюсь, это поможет, A +, Dom

1 голос
/ 29 июля 2011

Чтобы избежать взлома библиотеки dojo, просто переключитесь на таблицу данных YUI2; это редактор ячеек принимает функцию asyncsubmitter, которая отправляет ваши изменения на ваш сервер Это описание из документации

asyncSubmitter

Функция

Определенная разработчиком функция, которая может отправлять введенное значение на сервер. Эта функция должна принимать аргументы fnCallback и oNewValue. Когда передача завершена, функция также должна вызвать fnCallback (bSuccess, oNewValue), чтобы завершить процедуру сохранения в CellEditor. Эту функцию также можно использовать для дополнительной проверки или манипуляции с входными значениями. YUI2DataTable

1 голос
/ 23 апреля 2010

Это не очень подробное объяснение, но да, вы должны переопределить метод, который обрабатывает записи пользовательских данных, поскольку я не вижу события для этого. Поэтому в основном создайте новый класс, который наследует от сетки данных, найдите метод в исходном коде, который обрабатывает редактирование, и переопределите его, чтобы дать ему дополнительное действие для отправки его обратно на сервер. В этом методе вы также захотите вызвать действие по умолчанию для решетки данных.

Некоторая информация здесь (о которой вы, вероятно, уже знаете):

http://docs.dojocampus.org/dojox/grid/DataGrid#editing-data

Ранее я расширил стандартные компоненты Dojo, это не сложно. Я считаю, что всегда полезно изучить исходный код Dojo и просто быть осторожным при обновлении Dojo, чтобы убедиться, что новые версии не нарушают существующие функции.

...