Обновление Додзё - PullRequest
       10

Обновление Додзё

2 голосов
/ 07 апреля 2009

Используя Dojo 1.3, после добавления дочернего элемента (то есть папки или элемента) в дерево, есть ли способ немедленно отразить его через обновление или каким-либо другим способом?

Ответы [ 3 ]

0 голосов
/ 01 августа 2012

Скажем, если у вашей модели есть запрос `{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();
         }
      }
);
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 голосов
/ 07 апреля 2009

Из официального руководства Додзе

Обновление дерева

Люди часто спрашивают:

как обновить дерево (добавив или удаление элементов?)

Вы не можете обновить дерево напрямую, а точнее нужно обновить модель. Обычно модель подключен к хранилищу данных и в этом на случай, если вам нужно обновить данные хранить. Таким образом, вам нужно использовать данные магазин, который позволяет обновления (через это официальный API), вроде dojo.data.ItemFileWriteStore.

как обновить дерево из хранить?

Это не поддерживается. Магазин необходимо уведомить дерево любого изменения в данных. В настоящее время это действительно только поддерживается (из коробки) от dojo.data.ItemFileWriteStore, as настройка клиент-сервер dojo.data источник, где сервер уведомляет клиент всякий раз, когда данные изменились довольно сложно, и за область применения додзё, которая доступна только для клиентов решение.

...