我从本教程开始http://dojotoolkit.org/documentation/tutorials/1.6/store_driven_tree/
设置我的ServerSide Restfull服务后,到目前为止一切正常。我通过以下方式为树做了一个上下文菜单:
<ul dojoType="dijit.Menu" id="contextMenu" style="display: none;">
<li dojoType="dijit.MenuItem" iconClass="dijitEditorIcon dijitEditorIconDelete" onclick="pages.remove(tn.item.id);">delete page</li>
</ul>
<script type="dojo/connect">
var menu = dijit.byId("contextMenu");
menu.bindDomNode(this.domNode);
dojo.connect(menu, "_openMyself", this, function(e){
// get a hold of, and log out, the tree node that was the source of this open event
tn = dijit.getEnclosingWidget(e.target);
// contrived condition: disable all menu items except the "New Page" item
dojo.forEach(menu.getChildren(), function(child){
if(child.label != "Neue Seite")
{
child.set('disabled', typeof tn.item == 'undefined');
}
});
});
</script>
现在我知道用户在wich节点右键单击contextmenu并用“pages.remove(tn.item.id);”删除它。来自数据库。要通知树我覆盖了删除功能:
remove: function(objectId){
this.onDelete({id: objectId});
return dojo.store.JsonRest.prototype.remove.apply(this, arguments);
}
一切都按预期工作但如果我现在正在使用树中的项目做一些其他事情,例如拖动项目到根目录,我之前删除了一个孩子。树不再正确显示它。我认为商店的remove方法只将DELETE查询发送到服务器,但不会从商店中删除该项。如何获取商店中的商品数组以检查并删除商品?
答案 0 :(得分:0)
dijit.Tree是底层dojo.data模型的表示,您想要对树进行的任何更改都需要对底层数据存储进行。请参阅此处的说明:http://dojotoolkit.org/reference-guide/dijit/Tree.html#dijit-tree因此,您应该使用dojo.data API修改商店,然后重新呈现树以反映更改,而不是覆盖remove函数。查看可用的各种方法的最佳来源是dojo nightly文件。具体来说,dojo.data文件位于:http://archive.dojotoolkit.org/nightly/dojotoolkit/dojo/data/
var item = tree.fetchItemByIdentity("selectedItem"); //find the item you want to remove
store.deleteItem(item); //delete the item from the data store
store.save(); //save the change made to the store