Как динамически обновлять данные дерева додзё - PullRequest
9 голосов
/ 23 марта 2011

Хотелось бы узнать, как динамически обновлять данные компонента dojo.dijit.tree.В данный момент я создаю дерево, используя dojo.data.ItemFileReadStore и dijit.tree.ForestStoreModel.После создания дерева я хотел бы периодически перезагружать его новыми данными JSON.

Вот как я сейчас создаю дерево:

<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" />

Заранее спасибо.*

Ответы [ 7 ]

20 голосов
/ 25 марта 2011

Явно вы «не можете», но это не значит, что вы не можете взломать вещи на куски и умереть, пытаясь.

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();

},

Это освежит ваше дерево.

9 голосов
/ 10 февраля 2012

Вот проблема с решением Layke (которое в противном случае работает), найденным при предварительном тестировании для коммерческого сайта.

Дело 1:

  • Создание и заполнение дерева.
  • Нажмите на узел, чтобы выбрать.
  • Выполните refreshTree, как в решении Layke.
  • Нажмите на узел, получите ошибку «this.labelNode не определен».

Теперь начнем снова, случай 2:

  • Создать и заполнить дерево.
  • Нажмите на узел, чтобы выбрать.
  • Ctrl-клик по ранее выбранному узлу.
  • Выполните refreshTree, как в решении Layke.
  • Нажмите на узел, без ошибок.

Сохраненные ссылки выбора для первого выбора используются для отмены атрибуты выбора (цвет фона и т. д.) при втором выборе. К сожалению, упомянутые объекты теперь находятся в ведре битов. Модифицированный код похоже, что он готов к производству, т. е. не прошел предварительных испытаний.

Решение поставить:

Tree.dndController.selectNone();

до первой строки решения Layke's 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 голос
/ 23 февраля 2012

Спасибо за эту функцию, прекрасно работает в моем дереве.

Уведомление для тех, кто новичок в додзё (как и я) ... После создания дерева необходимо расширить дерево с помощьюфункция обновления:

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

Затем вы можете вызвать функцию с помощью:

dijit.byId('myTree').refresh();
0 голосов
/ 08 сентября 2014

Проходя через эти ответы, я создал свой собственный метод обновления отдельных узлов за раз, и НЕ нуждается в обновлении.

_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];
        }
    }  
}
0 голосов
/ 20 ноября 2013

Решение Лайке у меня не сработало. Я использую додзё 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 голосов
/ 11 октября 2013

Обновление вашего магазина автоматически обновит ваше дерево!

  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 голосов
/ 23 марта 2011

В настоящее время не поддерживается.Смотрите здесь .

...