EXTjs 5 узлов дерева с двойной загрузкой

У меня много проблем с деревьями ext5, поэтому я решил опубликовать здесь и посмотреть, что вы, ребята, заметили, и, надеюсь, помочь вам с этими ошибками 5.0.0...

TreeStore загружается дважды, если я установил для него значение

autoload:true

. Из-за этого он каким-то образом дублирует узлы, показанные на панели дерева, вызывая всевозможные проблемы/ошибки...

Итак, при создании обходного пути я установил для TreeStore значение

autoload:false

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

var s = Ext.getStore('myStore');
s.load();

Ни одно дерево не покрасят...

Итак, обходной путь номер два (УЖАСНОЕ решение) — пусть магазин загружается автоматически (с двумя прокси-вызовами), но после рендеринга дерева удаляет все данные, а затем снова загружает магазин вручную.

(in the store)
...
autoload: true
...

(in the controller)
...
var s = Ext.getStore('myStore');
s.removeAll();
s.load();
...

Шазам! Дерево загружается в последний раз, и данные представлены только один раз! Без дублирования!!

Однако теперь все расширяющееся и схлопывающееся сломано. Никакие события не запускаются, расширение и свертывание узлов не работает... Может быть, свертывание/развертывание уже было нарушено?

Установите autoload:true, выньте код контроллера.

TreeStore загружается дважды; дубликаты узлов в древовидной панели; развернуть/свернуть работают правильно.


person Josh    schedule 01.08.2014    source источник


Ответы (3)


С тех пор я нашел обходной путь, а сенча "исправляет" эту проблему...

Отчет об ошибке в моем Sencha

Вот обходной путь, который я только что решил внедрить в каждый магазин, чтобы ничего подобного больше не повторялось:

...
listeners: {        
     beforeload: function (store, operation, eOpts) {            
          if(store.isLoading()) return false;        
     }    
}
...

Добавив это, ни один магазин никогда не будет «двойной загрузки». Это просто нелепо, что мы должны использовать этот тип обходного пути в...

Удачи, ребята!

person Josh    schedule 01.08.2014

Это не магазин, это взаимодействие с Tree Panel. У TreePanel есть некоторые неприятные проблемы, если хранилище не загружается или не загружается. На форуме Sencha есть несколько ошибок по этому поводу.

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

Если вы вызываете load после вставки его в TreeStore, корневой узел неверен, и хранилище не может отобразиться.

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

person Robert Watkins    schedule 01.08.2014
comment
Конечно. Поскольку я не загружаю каждый узел дерева динамически, это не проблема для моих деревьев. Спасибо за комментарий! - person Josh; 04.08.2014

var MenuStore = new Ext.data.TreeStore({
    storeId: 'MenuStore',
    model: 'BaseMenu',
    autoLoad: false,
    proxy: {
          type: 'ajax',
          url: '/menu.json'
    },
    root: {
        text: 'Menu',
        id: 'src',
        expanded: true,
        loaded:true
    }
});

настройка загружена: true решить мою проблему.

Этот работает для меня.

person Avinash Thakur    schedule 29.12.2015