我正在使用dojo datagrid来显示我的数据。当最终用户编辑单元格值时,应使用ajax调用在服务器中更新它(当焦点离开单元格时)。
否则,我应该有一个编辑&更新/取消每行的按钮以处理相同的功能。 但是我不知道如何编辑&更新网格内的按钮并捕获他们的事件。
默认情况下,dojo仅更新本地商店值(客户端)。 如何将更新的单元格值保存到服务器中?
我们需要编写任何覆盖方法吗?
我是道场新手。任何详细说明或示例代码将非常感激。
有人可以帮助解决这个问题吗?
谢谢
此致 拉吉
答案 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