2011-03-23 2 views
9

dojo.dijit.tree 구성 요소의 데이터를 동적으로 갱신하는 방법을 알고 싶습니다. 현재 dojo.data.ItemFileReadStore와 dijit.tree.ForestStoreModel을 사용하여 트리를 생성하고 있습니다. 트리를 만든 후에는 새 JSON 데이터를 주기적으로 새로 고침하고 싶습니다. 사전에dojo 트리 데이터를 동적으로 갱신하는 방법

<div dojoType="dojo.data.ItemFileReadStore" jsId="myStore" url=getJSONResult></div> 

<div dojoType="dijit.tree.ForestStoreModel" jsId="myModel" store="myStore" query="{type:'cat'}" rootId="myRoot" rootLabel="Data" childrenAttrs="children"></div> 

<div dojoType="dijit.Tree" model="myModel" labelAttr="sname" label="Data" /> 

감사 :

이 나는 ​​순간에 트리를 생성하는 방법이다.

답변

20

분명히 "할 수는 없지만"그렇다고 해킹하거나 해킹 할 수 없다는 의미는 아닙니다.

refreshTree : function(){ 
    dijit.byId("myTree").dndController.selectNone(); // As per the answer below  
    // Credit to this discussion: http://mail.dojotoolkit.org/pipermail/dojo-interest/2010-April/045180.html 
    // Close the store (So that the store will do a new fetch()). 
    dijit.byId("myTree").model.store.clearOnClose = true; 
    dijit.byId("myTree").model.store.close(); 

    // Completely delete every node from the dijit.Tree  
    dijit.byId("myTree")._itemNodesMap = {}; 
    dijit.byId("myTree").rootNode.state = "UNCHECKED"; 
    dijit.byId("myTree").model.root.children = null; 

    // Destroy the widget 
    dijit.byId("myTree").rootNode.destroyRecursive(); 

    // Recreate the model, (with the model again) 
    dijit.byId("myTree").model.constructor(dijit.byId("myTree").model) 

    // Rebuild the tree 
    dijit.byId("myTree").postMixInProperties(); 
    dijit.byId("myTree")._load(); 

}, 

그러면 트리가 새로 고침됩니다.

+1

Laykes에게 감사드립니다. 스크립트는 실제로 트리 렌더링을 새로 고칩니다. 그러나이 예제에서는 새 데이터를로드 할 수 없었습니다. 내가 만든 함수를 호출하는 주기적 새로 고침을 구현했습니다. 내 저장소에는 url 속성이 JSON 데이터가 들어있는 파일 이름으로 설정되어 있습니다. 파일의 데이터를 변경하지만 트리는 항상 초기 데이터를 렌더링합니다. 새 데이터를로드하는 방법을 알고 있습니까? – Zion

+0

죄송합니다 TheLostGuy, 나는 당신의 가게가 근처에 새로 고침으로 설정되어 있다고 가정. 추가 : dijit.byId ("myTree"). model.store.clearOnClose = true; – Layke

+0

Laykes에게 감사드립니다. 이것은 실제로 나를 위해 지금 일하고 있습니다. 건배! – Zion

-1

현재 지원되지 않습니다. here을 참조하십시오.

+0

감사합니다. 동적으로 업데이트 할 수있는 대체 트리를 알고 있습니까? – Zion

+0

Dojo에는 없지만 다른 툴킷이이를 제공 할 수 있습니다. 내가 도장에서하는 것은 전체 트리 (로드 아이콘 회)를 통해 dojox.widget.Standby 위젯을 올려 단순히 나무를 파괴하고 새로운 저장 (또는 다시 채워 가게)에 새 트리를 결합한다. – Andy

9

상용 웹 사이트의 사전 테스트에서 발견되는 Layke의 솔루션 (작동하지 않는)에 대한 문제가 있습니다.

사례 1 :

  • &이 나무를 채울 만듭니다.
  • 선택할 노드를 클릭하십시오.
  • Layke의 솔루션처럼 refreshTree를 실행하십시오.
  • 노드를 클릭하면 "this.labelNode is undefined"오류가 발생합니다.

    • 이 &이 나무를 채울 작성 :

  • 지금의 경우 2, 다시 시작합니다.
  • 선택할 노드를 클릭하십시오.
  • 이전에 선택한 노드를 Ctrl- 클릭하십시오.
  • Layke의 솔루션처럼 refreshTree를 실행하십시오.
  • 노드를 클릭하십시오. 오류가 없습니다.

두 번째 선택을 수행 할 때 선택 속성 (배경색 등)을 취소하는 데 첫 번째 선택에 저장된 선택 참조가 사용됩니다. 불행히도 참조 된 객체가 이제는 비트 버킷에 있습니다. 수정 코드 은 프로덕션 준비 상태로 표시됩니다. 즉 사전 프로덕션 테스트에 실패하지 않았습니다.

용액을 넣어이다

Tree.dndController.selectNone(); 

상기 종래의 Layke refreshTree 용액 제 라인. 이 기능에 대한

refreshTree : function() { 
    // Destruct the references to any selected nodes so that 
    // the refreshed tree will not attempt to unselect destructed nodes 
    // when a new selection is made. 
    // These references are contained in Tree.selectedItem, 
    // Tree.selectedItems, Tree.selectedNode, and Tree.selectedNodes. 
    Tree.dndController.selectNone(); 

    Tree.model.store.clearOnClose = true; 
    Tree.model.store.close(); 

    // Completely delete every node from the dijit.Tree  
    Tree._itemNodesMap = {}; 
    Tree.rootNode.state = "UNCHECKED"; 
    Tree.model.root.children = null; 

    // Destroy the widget 
    Tree.rootNode.destroyRecursive(); 

    // Recreate the model, (with the model again) 
    Tree.model.constructor(dijit.byId("myTree").model) 

    // Rebuild the tree 
    Tree.postMixInProperties(); 
    Tree._load(); 

} 
1

덕분에 내 나무에서 잘 작동 : 메타 제안에 대한 응답으로

는 여기있다.

나처럼 도장을 처음 사용하는 사람들에게 알림 ...나무의 생성 후에는 새로 고침 기능 트리를 확장 할 필요가 :

dijit.byId('myTree').refresh(); 
0

상점을 업데이트하면 자동으로 트리를 업데이트합니다 :

dojo.extend(dijit.Tree, { 
    refresh: function() { 
     this.dndController.selectNone(); 
     //... 
    } 
}); 

는 그런 다음으로 함수를 호출 할 수 있습니다!

  1. 데이터를 수정할 수있는 FileWriteStore가 필요합니다.
  2. 는 쿼리를 통해 업데이트 할 항목을 가져 가게를 사용합니다.
  3. 업데이트 각 항목이 돌아왔다.
  4. 그런 다음 저장을 저장하고 나무가 업데이트됩니다.

    FileWriteStore.fetch({ 
        query: { color: "red" }, 
        onComplete: function(items){ 
         for (var i = 0; i < items.length; i++){ 
          FileWriteStore.setValue(items[i], "color", "green"); 
         } 
         FileWriteStore.save();    
        } 
    }); 
    
0

Layke의 솔루션은 나를 위해 작동하지 않았다. 1.9.1 도장을 사용하고 있습니다. 내 스토어는 "ItemFileWriteStore"유형이고 "TreeStoreModel"유형의 모델입니다.

myStore = new ItemFileWriteStore({ 
    url : "../jaxrs/group/tree" 
}); 

itemModel = new TreeStoreModel({ 
    store : myStore, 
    query : { 
     id : "0" 
    } 
}); 
parser.parse(); 

이 나를 위해 작동합니다

var tree = dijit.byId('myTree'); 
tree.dndController.selectNone(); 
tree._itemNodesMap = {}; 
tree.model.root = null; 
tree.model.store.clearOnClose = true; 
tree.model.store.urlPreventCache = true; 
tree.model.store.revert(); 
tree.model.store.close(); 
tree.rootNode.state = "UNCHECKED"; 
if (tree.rootNode) { 
    tree.rootNode.destroyRecursive(); 
} 
tree.postMixInProperties(); 
tree._load(); 
0

내가 한 번에 한 번 특정 노드를 업데이트하고 새로 고침을 필요로하지 내 자신의 방법을 구축 한 다음 답변을 겪고 있지만. 응답 앤디에 대한

_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]; 
     } 
    } 
} 
관련 문제