如何处理dojo datagrid单元格更新,以便将它们自动发布回服务器?

时间:2010-04-23 18:09:41

标签: datagrid cell dojo

我正在使用dojo datagrid来显示我的数据。当最终用户编辑单元格值时,应使用ajax调用在服务器中更新它(当焦点离开单元格时)。

否则,我应该有一个编辑&更新/取消每行的按钮以处理相同的功能。 但是我不知道如何编辑&更新网格内的按钮并捕获他们的事件。

默认情况下,dojo仅更新本地商店值(客户端)。 如何将更新的单元格值保存到服务器中?

我们需要编写任何覆盖方法吗?

我是道场新手。任何详细说明或示例代码将非常感激。

有人可以帮助解决这个问题吗?

谢谢

此致 拉吉

3 个答案:

答案 0 :(得分:4)

为了能够推送更新服务器端,您必须覆盖_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 1.5中引入的dojo.Stateful将简化它,否则我们将不得不等待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 :(得分:1)

这不是一个非常详细的解释,但是你应该覆盖处理用户数据条目的方法,因为我没有看到这样的事件。因此,基本上创建一个继承自数据网格的新类,在源代码中找到处理编辑的方法并覆盖它,以便为其提供额外的操作以将其发布回服务器。您也希望在该方法中调用datagrid的默认操作。

此处的一些信息(您可能已经知道):

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

之前我已经扩展了Dojo的默认组件,这并不难。我发现检查Dojo源总是好的,并且在升级Dojo时要小心,以确保新版本不会破坏现有功能。

答案 2 :(得分:1)

为了避免破解你的dojo库,只需切换到YUI2数据表;它的单元格编辑器接受将您的编辑内容发送到服务器的asyncsubmitter函数 这是文档中的描述

asyncSubmitter

功能

实现者定义的函数,可以将输入值提交给服务器。此函数必须接受参数fnCallback和oNewValue。提交完成后,该函数还必须调用fnCallback(bSuccess,oNewValue)来完成CellEditor中的保存例程。此函数还可用于执行额外验证或输入值操作。 YUI2DataTable