# Glimmerの添付に失敗しました。エラーが発生しました

**URL:** https://meta.discourse.org/t/attempt-to-attach-glimmer-fails-with-error/304235
**Category:** Development
**Tags:** polls
**Created:** [2024 年 4 月 17 日午前 8:47 UTC](https://meta.discourse.org/t/attempt-to-attach-glimmer-fails-with-error/304235 "2024-04-17T08:47:28Z")
**Posts on this page:** 8
**Page:** 1

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [2024 年 4 月 17 日午前 8:47 UTC](https://meta.discourse.org/t/attempt-to-attach-glimmer-fails-with-error/304235/1 "2024-04-17T08:47:28Z")

</div>

Poll プラグインに PR を出しています。

以前も何度か行ったように、Glimmer コンポーネントをウィジェットツリーのリーフとしてレンダリングしようとしていますが、これまで見たことのない奇妙なエラーが発生しています。

`TypeError: this.parentMountWidgetComponent is undefined`

この行で発生しています。

> <https://github.com/discourse/discourse/blob/df373d90fe9460b49aaa771e138aebf3f768c803/app/assets/javascripts/discourse/app/widgets/render-glimmer.js#L163>

`this.widget?._findView() || this._emberView` が `undefined` になっているようです。

(`this.widget` は存在します)

> <https://github.com/discourse/discourse/blob/df373d90fe9460b49aaa771e138aebf3f768c803/app/assets/javascripts/discourse/app/widgets/render-glimmer.js#L181>

私の非常に初期段階のコードはここにあります。

> <https://github.com/merefield/discourse/blob/04ff184ce5b8310cedc09e2028a4e01df0e73fea/plugins/poll/assets/javascripts/discourse/widgets/discourse-poll.js#L125>

このコンテキストで `RenderGlimmer` を使用することは合法ですか？

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [2024 年 4 月 17 日午前 9:34 UTC](https://meta.discourse.org/t/attempt-to-attach-glimmer-fails-with-error/304235/2 "2024-04-17T09:34:29Z")

</div>

これは、祖先にこのプロパティがあることに依存していますか？

`this._findAncestorWithProperty("_emberView")`

これは未定義で返されます。

または、それ自体が `_emberView` を持っている（持っていませんが）

> <https://github.com/discourse/discourse/blob/df373d90fe9460b49aaa771e138aebf3f768c803/app/assets/javascripts/discourse/app/widgets/widget.js#L257>

祖先にはここで設定されているはずだと推測しています。

> <https://github.com/discourse/discourse/blob/df373d90fe9460b49aaa771e138aebf3f768c803/app/assets/javascripts/discourse/app/components/mount-widget.js#L168>

なるほど、もう少し情報があります。

投票が（ウィジェットのツリーとして）レンダリングされると、この行が実行されますが、投票に戻ると実行されません。そのため、何らかの理由で `_emberView` を持つ祖先が存在しない（または見つからない）のです。

この問題の原因は、ウィジェットが再レンダリングされないことかもしれません。

` rerenderWidget() {`

新しいウィジェットのツリーを追加しても、再び呼び出されません。そのため、このプロパティは設定されません。

したがって、この解決策は、投票ボタンが押されたときに再レンダリングをスケジュールすることかもしれません…

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

```

…いいえ、これは解決しません。

追加情報：

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

```

これは、プロパティをツリーの上方向に検索しています。

最初のビューでは、これは `post-stream` レベルにあります。

しかし、何らかの理由でウィジェットは祖先を失っているようです…

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [2024 年 4 月 17 日午前 10:18 UTC](https://meta.discourse.org/t/attempt-to-attach-glimmer-fails-with-error/304235/3 "2024-04-17T10:18:16Z")

</div>

了解しました。さらに調査しました。

> <https://github.com/discourse/discourse/blob/df373d90fe9460b49aaa771e138aebf3f768c803/app/assets/javascripts/discourse/app/widgets/widget.js#L246>

ウィジェットのトラバーサルが発生する階層は次のとおりです。

```plaintext
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` になります。

したがって、プロパティが見つからず、その時点でトラバーサルは停止します。

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [2024 年 4 月 17 日午後 12:26 UTC](https://meta.discourse.org/t/attempt-to-attach-glimmer-fails-with-error/304235/4 "2024-04-17T12:26:34Z")

</div>

投票プラグインは少し特殊で、ウィジェットは `MountWidget` コンポーネントを介して直接Emberテンプレート内にマウントされるのではなく、投稿の調理済みHTML内にマウントされます。そのため、ここに追加のロジックが必要になる可能性があります…確認します 👀

報告ありがとうございます @merefield！

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [2024 年 4 月 18 日午後 2:29 UTC](https://meta.discourse.org/t/attempt-to-attach-glimmer-fails-with-error/304235/6 "2024-04-18T14:29:38Z")

</div>

これをマージすれば、@merefield さん、コードが動作するはずです。

> <https://github.com/discourse/discourse/pull/26675>
>
> In this case, the top-level widget being glued must have a \`\_postCookedWidget\` a…ttribute.

特にきれいではありませんが、これは非常にまれな状況であり、近い将来にこのウィジェット/RenderGlimmer のすべてを完全に削除することを期待しているので、これで大丈夫だと思います 🤞

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [2024 年 4 月 18 日午後 2:33 UTC](https://meta.discourse.org/t/attempt-to-attach-glimmer-fails-with-error/304235/7 "2024-04-18T14:33:10Z")

</div>

Davidさん、ありがとうございます。一時的な妥協案で十分だというのは理にかなっていますね 👍

マージされたら（そしてフォークを更新する必要があったら！）テストします 😅

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [2024 年 4 月 19 日午前 11:14 UTC](https://meta.discourse.org/t/attempt-to-attach-glimmer-fails-with-error/304235/9 "2024-04-19T11:14:28Z")

</div>

David、迅速な対応ありがとうございます。

これで問題なく動作することを確認しました。  
この件で他に問題が見つかった場合は、こちらに投稿します。

 ![image](https://global.discourse-cdn.com/meta/original/4X/d/d/8/dd86fb1b198ded9c4b669bb181cf75e2da4e274c.png)

（スクリーンショットに関する注意：このプロジェクトはまだ初期段階です！）

---

<div class="post-metadata">

### Author: ![system](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/system/32/443519_2.png) [@system](https://meta.discourse.org/u/system)
#### Post date: [2024 年 5 月 19 日午前 11:15 UTC](https://meta.discourse.org/t/attempt-to-attach-glimmer-fails-with-error/304235/10 "2024-05-19T11:15:18Z")

</div>

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