尝试附加Glimmer失败,出现错误

我正在为 Poll 插件做一个 PR。

我尝试将 Glimmer 组件渲染为 widget 树的叶子,就像我以前做过几次一样,但遇到了这个奇怪的错误,以前从未见过:

TypeError: this.parentMountWidgetComponent is undefined

在这一行触发:

看起来 this.widget?._findView() || this._emberView

undefined

this.widget 存在)

我非常早期的代码在这里:

在这种情况下使用 RenderGlimmer 合法吗?

1 个赞

这依赖于祖先拥有此属性?

this._findAncestorWithProperty("_emberView")

该属性返回 undefined。

或者它本身拥有一个 _emberView(但它没有)

我猜祖先应该在这里设置了它:

好的,更多信息。

当投票被渲染(作为 widget 树)时,这行代码会被执行,但当你返回投票时,它不会被执行,因此出于某种原因,没有祖先拥有“_emberView”(或者没有找到它)

这个问题的根源可能是 widget 从未被重新渲染:

rerenderWidget() {

尽管添加了新的 widget 树,但它没有再次触发……因此该属性从未被设置。

……因此,解决方案可能是安排在点击投票按钮时重新渲染……

  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 级别。

但不知何故,widget 似乎正在失去它们的祖先……

好的,我进一步研究了一下:

这是 widget 遍历发生的层级:

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

现在,最后一个现有的 widget… 没有父 widget。

parentWidgetundefined

而且最关键的是它没有“_emberView”属性,所以结果是 undefined

因此,永远找不到该属性,遍历也在此停止。

3 个赞

投票插件有点不寻常,因为它挂载的小部件位于帖子的已渲染 HTML 中,而不是直接通过 MountWidget 组件挂载到 Ember 模板中。所以我们可能需要在这里添加一些额外的逻辑……我会看看 :eyes:

感谢你的报告 @merefield

3 个赞

我认为如果我们合并这个,它应该能让你的代码正常工作 @merefield

它不是特别漂亮,但我认为还可以,因为这种情况很少见,而且我们希望在不久的将来完全移除所有这些 widget/RenderGlimmer 的东西 :crossed_fingers:

4 个赞

谢谢 David。是的,暂时的折衷方案是说得通的 :+1:

一旦(或者如果)它被合并,我就会进行测试(而且我将不得不更新我的 fork!:sweat_smile:

4 个赞

非常感谢您对此事的快速响应,David。

我确认这现在对我来说可以正常工作了。

如果我在此安排中发现任何进一步的问题,我会在此处发布。

(截图说明:该项目尚处于非常早期阶段!)

2 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.