Попытка подключения Glimmer завершается ошибкой

Я работаю над PR для плагина Poll.

Я пытаюсь отрендерить компонент Glimmer как лист дерева виджетов, как я делал это несколько раз ранее, но получаю странную ошибку, которую раньше не встречал:

TypeError: this.parentMountWidgetComponent is undefined

ошибка возникает на этой строке:

Похоже, что this.widget?._findView() || this._emberView

возвращает undefined.

(this.widget существует)

Мой код на очень ранней стадии находится здесь:

Разрешено ли использовать RenderGlimmer в этом контексте?

Это зависит от того, что у предка есть это свойство?

this._findAncestorWithProperty("_emberView")

который возвращает undefined.

Или от того, что у самого элемента есть _emberView (но у него его нет).

Я предполагаю, что у предка это должно было быть установлено здесь:

OK, немного больше информации.

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

Причиной этой проблемы может быть то, что виджет никогда не перерисовывается:

rerenderWidget() {

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

… следовательно, решением может быть планирование перерисовки при нажатии кнопки «Голосовать» …

  toggleResults() {
    **this.scheduleRerender();**
    this.state.showResults = !this.state.showResults;
  },

… нет, это не решает проблему.

Дополнительная информация:

  _findAncestorWithProperty(property) {
    let widget = this;
    while (widget) {
      const value = widget[property];
      if (value) {
        return widget;
      }
      widget = widget.parentWidget;
    }
  }

Это ищет свойство, поднимаясь вверх по дереву.

При первоначальном отображении это происходит на уровне post-stream.

Но каким-то образом виджеты, похоже, теряют свою иерархию…

Хорошо, я немного копнул глубже:

Вот иерархия, по которой происходит обход виджетов:

discourse-poll-option-dropdown-245da0f65a66dbd539bcd27e501d759a [widget.js:250:14](webpack://discourse/widgets/widget.js)

discourse-poll-option-245da0f65a66dbd539bcd27e501d759a [widget.js:250:14](webpack://discourse/widgets/widget.js)

poll-container-poll-1247 [widget.js:250:14](webpack://discourse/widgets/widget.js)

poll-poll-1247

Теперь самый последний существующий виджет… не имеет родительского виджета.

parentWidget равен undefined.

И самое главное: у него нет свойства “_emberView”, поэтому результат — undefined.

Таким образом, свойство никогда не находится, и на этом этапе обход прекращается.

Плагин опросов немного необычен тем, что виджет монтируется внутри обработанного HTML-кода поста, а не напрямую внутри шаблона Ember через компонент <MountWidget. Поэтому, вероятно, нам нужно добавить здесь дополнительную логику… посмотрю :eyes:

Спасибо за сообщение, @merefield!

Я думаю, что если мы объединим это, ваш код должен заработать @merefield

Это не особенно красиво, но, я думаю, это допустимо, так как это довольно редкая ситуация, и мы надеемся полностью убрать всю эту магию с виджетами и RenderGlimmer в ближайшем будущем :crossed_fingers:

Спасибо, Дэвид. Да, имеет смысл, что компромисс может подойти на время :+1:

Я протестирую это, как только (или если) оно будет слито (и мне придется обновить свой форк! :sweat_smile:)

Действительно благодарю за быструю реакцию по этому вопросу, Дэвид.

Могу подтвердить, что теперь у меня всё работает.

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

(Оговорка по скриншоту: проект находится на самой ранней стадии!)