Ошибка: Cannot read property 'destructor' of undefined

Использую сервисы plugins.Locale и plugins.Theme.

Прекрасно заработали сразу. Пока не повесил их на sidemenu.

Не могу с той поры выйти из ошибки (ниже диагностика из DevTools Chrome для 'locale', то же самое и для 'theme'), может быть подобная проблема имела место у кого-нибудь? Как решать?, всё перепробовал (вызывается
setLang(value, false), чтобы сделать refresh с изменённым языком, там и вызываются дектрукторы):

JetView.js:114 Uncaught TypeError: Cannot read property 'destructor' of undefined
    at JetViewRaw.destructor (JetView.js:114)
    at TopView.destructor (JetView.js:107)
    at JetApp.refresh (JetApp.js:90)
    at Object.setLang (Locale.js:24)
    at TopView.toggleLanguage (topview.js:452)
    at result.onChange (topview.js:342)
    at result.callEvent (webix_debug.js:574)
    at result.setValue (webix_debug.js:9004)
    at result._applyChanges (webix_debug.js:9296)
    at HTMLSelectElement.<anonymous> (webix_debug.js:247)
destructor @ JetView.js:114
destructor @ JetView.js:107
refresh @ JetApp.js:90
setLang @ Locale.js:24
TopView.toggleLanguage @ topview.js:452
onChange @ topview.js:342
callEvent @ webix_debug.js:574
setValue @ webix_debug.js:9004
_applyChanges @ webix_debug.js:9296
(anonymous) @ webix_debug.js:247
19:53:57.506 

Comments

  • К сожалению, у нас не получилось повторить ошибку локально
    Судя по стек-трейсу, при попытке перерисовать интерфейс, одно из View содержит пустой элемент вместо Webix виджета. Такое возможно только если при его отрисовке произошла ошибка.

    попробуйте добавить debug:true в конфигурацию приложения, и глянуть в консоли не будет ли там сообщений об ошибках во время отрисовки

  • edited March 2018

    Спасибо, maksim.

    В отладчике видно, что в JetApp не инициализирована переменная _root.
    Соответственно, _root.decstructor() приводит к краху.

    Я могу пояснить мою схему реализации сервисов.

    Если класс используемых сервисов генерируется как top/sets (sets - класс изменения локали и темы), то всё ок. Но хотелось покрасивее: я попытался сначала эти же работающие функции вставить в sidemenu. То есть, сверху там обычные пункты меню, запускающие какие-то свои view("..."), а снизу - view:"select" с Locale и Theme.
    Сначала все реализации переключений языка и тем (toggle - функции) были прямо в классе TopView. Потом я переписал всё, используя отдельный класс, как это было изначально, но с обычным меню. Только view:"select" пытался тоже вставить в sidemenu.

    Ничего не изменилось. Та же ошибка.
    То есть, когда объекты создаются в { $subview:true }, то - всё без проблем, почти как в мануалах по Webix Jet. Но если это не так, - то нет в классе-носителе sidemenu объектов, которые создаются в этом sidemenu, так, что ли, получается?

    В общем, упёрся конкретно, и вернулся к старой работающей схеме, но и с sidemenu наелся, не применяю пока, боюсь, что-нибудь ещё выскочит.

    Судя по реализации, sidemenu вообще висит в воздухе. Оно двигается туда-сюда через $$(...). Вот я и не понимаю, как там в объектах, прикреплённых к sidemenu и не связанных друг с другом через Jet-механизм ({ $subview:true } ?...) в одном объекте может появиться _root на другой...

  • edited March 2018

    у меня была похожая ситуация. связано было с тем, что при деструкции объекта один из связанных объектов (созданных через this.ui(...)) был уже деструктирован. таким образом при повторном вызове destructor, его _root был неопределен.
    решил проблему созданием собственного класса наследуя JetView и в дальнейшем используя его вместо JetView:

    MyJetView.ts
    export class MyJetView extends JetView {
        destructor(){
            if (this.app) { // т.е. destructor вызывается впервые
                super.destructor();
            }
        }
    }
    
  • edited March 2018

    Спасибо, intregal!

    Похоже, нужно быть очень аккуратным с сочетанием Webix Jet (this.ui(...)) и webix.ui(...) в одной упаковке. Почему-то у меня иногда декларируемые в Webix Jet руководстве методы не работают - ошибки типа описанной, чего-то где-то не существует... Делаешь через webix.* - всё идёт. И наоборот.
    Я не добрался до подобного решения проблемы, пытался исследовать по исходникам Jet, отлавливая, откуда может инициироваться _root - а надо было ещё и незапланированную деструкцию отлавливать, как я понял, но стало понятно, что закопаюсь...

Sign In or Register to comment.

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!