여러분 안녕하세요!
Glimmer 컴포넌트에서 변경 감지(change detection) 관련으로 문제가 발생해서 조언이 필요합니다. @tracked 배열 내 객체의 프로퍼티를 변경(mutation)해도 템플릿이 다시 렌더링되지 않습니다.
**현재 설정:**
```javascript
import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import { fn } from '@ember/helper';
import { on } from '@ember/modifier';
import { action } from '@ember/object';
export default class CustomSidebarComponent extends Component {
@tracked items = [
{
id: 'home',
label: 'Home',
expanded: false
},
{
id: 'my-posts',
label: 'My Posts',
expanded: false
}
// ... 더 많은 항목
];
@action
toggleExpanded(item) {
item.expanded = !item.expanded; // 이 변경은 다시 렌더링을 트리거하지 않습니다
console.log('Toggled:', item.label, item.expanded); // 정상적으로 로그가 출력됩니다
}
<template>
<div id="custom-sidebar">
<ul>
{{#each this.items key="@index" as |item|}}
<li class="menu-item {{if item.expanded 'expanded'}}" {{on "click" (fn this.toggleExpanded item)}}>
{{item.label}} {{if item.expanded "(expanded)" ""}}
</li>
{{/each}}
</ul>
</div>
</template>
}
```
**문제:**
1. 클릭 핸들러가 정상적으로 실행됩니다
2. item.expanded 프로퍼티가 업데이트됩니다 (콘솔에서 확인됨)
3. 하지만 템플릿이 다시 렌더링되지 않습니다 - 클래스 변경 없음, 텍스트 변경 없음
**시도해 본 것들:**
1. **배열 재할당** - 변경 후 this.items = [...this.items] 실행 (동작하지 않음)
2. **Immer를 이용한 불변 업데이트** - 시도하고 싶었지만 Discourse 테마에서 npm 임포트를 작동시킬 수 없었습니다
3. **다른 키 전략** - key="@index" 대신 key="id" 사용
**질문:**
- Glimmer에서 @tracked 배열 내 객체의 프로퍼티를 변경하는 것이 동작하도록 의도된 것인가요?
- 개별 객체를 어떤 방식으로든 tracked로 만들어야 하나요?
- 이 사용 사례에 대한 권장 패턴이 있나요?
- 이것이 Discourse 테마 환경에서 실행되고 있기 때문일 수 있나요?
- 반응성 라이브러리에 영향을 미치는 Discourse 테마의 npm 임포트 제한 사항이 있나요?
**환경:**
- Discourse 테마 컴포넌트
- .gjs 파일이 있는 Glimmer 컴포넌트
- 최신 Discourse 버전 - 오늘 업데이트됨
어떤 통찰도 큰 도움이 될 것입니다! Glimmer의 반응성 시스템에 대해 제가 근본적으로 놓치고 있는 것이 있나요?
감사합니다!