我正在为 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。
parentWidget 是 undefined。
而且最关键的是它没有“_emberView”属性,所以结果是 undefined。
因此,永远找不到该属性,遍历也在此停止。
3 个赞
david
(David Taylor)
4
投票插件有点不寻常,因为它挂载的小部件位于帖子的已渲染 HTML 中,而不是直接通过 MountWidget 组件挂载到 Ember 模板中。所以我们可能需要在这里添加一些额外的逻辑……我会看看 
感谢你的报告 @merefield!
3 个赞
david
(David Taylor)
6
我认为如果我们合并这个,它应该能让你的代码正常工作 @merefield
它不是特别漂亮,但我认为还可以,因为这种情况很少见,而且我们希望在不久的将来完全移除所有这些 widget/RenderGlimmer 的东西 
4 个赞
谢谢 David。是的,暂时的折衷方案是说得通的 
一旦(或者如果)它被合并,我就会进行测试(而且我将不得不更新我的 fork!
)
4 个赞
非常感谢您对此事的快速响应,David。
我确认这现在对我来说可以正常工作了。
如果我在此安排中发现任何进一步的问题,我会在此处发布。
(截图说明:该项目尚处于非常早期阶段!)
2 个赞
system
(system)
关闭
10
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.