Glimmer 첨부 시도 시 오류 발생

Poll 플러그인에 대한 PR을 작업 중입니다.

과거에 여러 번 했던 것처럼 Glimmer 컴포넌트를 위젯 트리 리프로 렌더링하려고 하는데, 이전에 본 적 없는 이상한 오류가 발생합니다:

TypeError: this.parentMountWidgetComponent is undefined

해당 오류는 이 줄에서 발생하고 있습니다:

this.widget?._findView() || this._emberView

가 undefined인 것 같습니다.

(this.widget은 존재합니다)

아직 초기 단계인 제 코드는 여기에 있습니다:

이 컨텍스트에서 RenderGlimmer를 사용하는 것이 허용됩니까?

이것이 조상이 해당 속성을 가지고 있다는 데 의존하는 건가요?

this._findAncestorWithProperty("_emberView")

이것이 undefined로 반환됩니다.

아니면 자기 자신에게 _emberView가 있는 경우(그렇지 않음)

조상이 여기서 설정되어 있어야 한다고 추측합니다:

OK, 좀 더 정보를 드리겠습니다.

Poll이 렌더링될 때(위젯 트리로), 이 줄이 실행되지만 투표로 전환하면 실행되지 않습니다. 따라서 어떤 이유에서인지 "_emberView"가 있는 조상이 없습니다(또는 발견되지 않습니다).

이 문제의 원인은 위젯이 다시 렌더링되지 않기 때문일 수 있습니다:

rerenderWidget() {

새로운 위젯 트리를 추가했음에도 불구하고 다시 트리거되지 않습니다 … 따라서 이 속성이 설정되지 않습니다.

… 따라서 해결책은 Vote 버튼을 눌렀을 때 재렌더링을 예약하는 것일 수 있습니다 …

  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 레벨에 나타납니다.

하지만 어떻게든 위젯들이 계보(ancestry)를 잃어버리는 것 같습니다 …

네, 좀 더 파고들어 보았습니다:

위젯 탐색이 올라가는 계층 구조는 다음과 같습니다:

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가 됩니다.

따라서 해당 속성이 절대 발견되지 않고, 그 시점에서 탐색이 중단됩니다.

투표 플러그인은 위젯이 Ember 템플릿의 <MountWidget 컴포넌트를 통해 직접 삽입되는 것이 아니라, 게시물의 cooked HTML 내부에 마운트된다는 점에서 다소 비범합니다. 따라서 여기에는 몇 가지 추가 로직이 필요할 것 같습니다… 확인해 보겠습니다 :eyes:

리포트해 주셔서 감사합니다 @merefield!

이 PR을 병합하면 @merefield 님의 코드가 정상적으로 작동할 것 같습니다.

별도로 깔끔하지는 않지만, 꽤 드문 상황이고 머지않아 이 widget/RenderGlimmer 관련 코드를 완전히 제거할 계획이므로 괜찮다고 생각합니다 :crossed_fingers:

데이비드, 고마워. 네, 그 사이 타협안이 충분할 수 있다는 말이 맞는 것 같아 :+1:

병합되면(혹은 병합될 경우) 테스트해볼게 (그리고 포크도 업데이트해야 해! :sweat_smile:)

데이비드, 빠른 처리 정말 감사합니다.

이제 정상적으로 작동하는 것을 확인했습니다.

이 구성과 관련하여 추가적인 문제가 발견되면 이곳에 게시하겠습니다.

(스크린샷 주의: 이 프로젝트는 아직 초기 단계입니다!)