Dojo 1.3 を使用して、子 (つまり、フォルダーまたはアイテム) をツリーに追加した後、更新またはその他の方法ですぐに反映させる方法はありますか?
3 に答える
Dojo公式マニュアルより
ツリーの更新
人々はよく尋ねます:
ツリーを更新するにはどうすればよいですか (項目の追加または削除?)
ツリーを直接更新することはできませんが、モデルを更新する必要があります。通常、モデルはデータ ストアに接続されており、その場合はデータ ストアを更新する必要があります。したがって、dojo.data.ItemFileWriteStore のように、(公式 API を介して) 更新できるデータ・ストアを使用する必要があります。
ストアからツリーを更新するにはどうすればよいですか?
これはサポートされていません。ストアは、データへの変更をツリーに通知する必要があります。現在、これは実際には dojo.data.ItemFileWriteStore によってのみ (すぐに) サポートされています。データが変更されるたびにサーバーがクライアントに通知するクライアント/サーバー dojo.data ソースのセットアップは非常に複雑であり、その範囲を超えているためです。クライアントのみのソリューションである dojo。
たとえば、モデルにクエリ `{type:'continent'} がある場合、つまり、このプロパティを持つすべてのアイテムが最上位アイテムであることを意味し、次のモデル拡張は変更を監視し、ツリーのビューを更新します
var dataStore = new ItemFileWriteStore( { ... });
new Tree({
store: dataStore,
model: new ForestModel({
onNewItem: function(item, parentInfo){
if(this.store.getValue(item, 'type') == 'continent'){
this._requeryTop();
}
this.inherited(arguments);
}
}
});
これにより、ツリーが呼び出さchildrenChanged
れ、新しいアイテムが追加されるたびに更新されます。
モデル リファレンスを参照
さらに、追加されたアイテムがトップレベルのアイテムでない場合、このステートメントを使用して即時更新を実行できる必要があります。parent
にアイテムが追加されたツリーノードchildren
です。
tree._collapseNode(parent);
parent.state = 'UNCHECKED';
tree._expandNode(parent);
多かれ少なかれ「標準的な」ツリーの更新は、次の方法で実現できます。基本実装に追加されていない理由は、ツリー上の DnD 機能とのリンクが壊れるためだと思います
dojo.declare("My.Tree", [dijit.Tree], {
// Close the store? (So that the store will do a new fetch()).
reloadStoreOnRefresh : true,
update: function() {
this.model.store.clearOnClose = this.reloadStoreOnRefresh;
this.model.store.close();
// Completely delete every node from the dijit.Tree
delete this._itemNodesMap;
this._itemNodesMap = {};
this.rootNode.state = "UNCHECKED";
delete this.model.root.children;
this.model.root.children = null;
// Destroy the widget
this.rootNode.destroyRecursive();
// Recreate the model, (with the model again)
this.model.constructor(this.model)
// Rebuild the tree
this.postMixInProperties();
this._load();
}
}
);
更新を必要とせずにこれを解決しました。
_refreshNodeMapping: function (newNodeData) {
if(!this._itemNodesMap[newNodeData.identity]) return;
var nodeMapToRefresh = this._itemNodesMap[newNodeData.identity][0].item;
var domNode = this._itemNodesMap[newNodeData.identity][0].domNode;
//For every updated value, reset the old ones
for(var val in newNodeData)
{
nodeMapToRefresh[val] = newNodeData[val];
if(val == 'label')
{
domNode.innerHTML = newNodeData[val];
}
}
}