ExtJS 6.2 обновляет данные TreeGrid из хранилища без перезагрузки с сервера

#javascript #extjs #extjs6 #extjs6-classic

#javascript #extjs #extjs6 #extjs6-классический

Вопрос:

У меня есть две древовидные сетки, которые используют одно и то же хранилище. Когда я перетаскиваю элемент из одного в другой, кажется, происходят все необходимые обновления (запись исчезает из местоположения в левом дереве, размещается в правом дереве, левое дерево теперь также показывает новое размещение).

Однако, если я попытаюсь перетащить ту же запись обратно в исходное место, окажется, что ее родительский элемент никогда не обновлялся, чтобы сказать, что он ушел.

Здесь я проверяю, могу ли я удалить элемент:

 listeners: {
            nodedragover: function(targetNode, position, dragData, e, eOpts) {
        console.log("Trying to drop");
        var ruleStore = this.getStore('rules');

        // Ensure leaf is adding as a leaf
        if (position === 'before') {
            return false;
        }

        // Check first that the target is a pool and not a leaf
        if (targetNode.data.leaf) {
            console.log("A leaf! Can't drop here")
            return false;
        } else {
            console.log("A node! Drop it like it's hot");
        }

        var allowDrop = true;
        var dropMessage = [];

        var records = dragData.records;
        var targetPool = targetNode.data;
        console.log("Dragdata: ", dragData);
        console.log("targetPool: ", targetPool);
        console.log("Store: ", Ext.getStore('Pools'));

        // Check platform, sample names, indicies
        for (var i = 0; i < records.length; i  ) {
            var rec = records[i].data;
            if (rec.platform !== targetPool.platform) {
                allowDrop = false;
                dropMessage.push("Sample platform does not match target pool platform");
                break;
            } else if (targetPool.children.map(
                function(child){ return child.sample_name;}).indexOf(rec.sample_name) > -1) {
                allowDrop = false;
                dropMessage.push("Sample is already in this pool");
                break;
            } else if (targetPool.children.map(
                function(child){ return child.sample_index;}).indexOf(rec.sample_index) > -1) {
                allowDrop = false;
                dropMessage.push("Sample index is already in this pool");
                break;
            }
        }
        console.log(dropMessage);
        return allowDrop;
    },
  

Когда я получаю хранилище с помощью Ext.getStore(‘Pools’), это отражает, что элемент был удален из его старого родительского элемента и теперь находится в новом родительском элементе. Однако целевой узел из события nodedragover все еще имеет старое состояние.

Как я могу получить древовидное представление, отражающее хранилище, но без перезагрузки хранилища с сервера (все это должно выполняться на стороне клиента)?

Я чувствую, что мне здесь не хватает какой-то фундаментальной концепции.

Ответ №1:

Вы можете использовать

 treeView.refresh();
  

или

 treeView.refreshNode(recordModified);
  

поскольку представление дерева расширено из view.table
Вот документы http://docs.sencha.com/extjs/6.0.2/classic/Ext.view.Table.html#метод-обновить

Комментарии:

1. Вы правы. Часть моей первоначальной проблемы заключалась в том, что я использовал дочерний атрибут, а не атрибут childNodes для выполнения назначений и перемещения.