지금 만들고 있는 테마 컴포넌트에서 서비스를 사용하려고 합니다. 서비스가 플러그인에서만 사용 가능하다면, 플러그인도 만들어 볼 수 있습니다. 목표는 두 개의 다른 플러그인 아웃렛을 연결하는 것입니다. 한 아웃렛의 버튼을 누르면, 다른 아웃렛에서 그 버튼 누름이 감지되도록 하는 것이죠.
Discourse에서 서비스를 올바르게 등록하는 방법은 무엇인가요? 여기의 주제와 GitHub의 관련 플러그인 코드를 따라 해 보았지만, 작동하지 않습니다.
누락된 부분이 내 테마 컴포넌트가 서비스를 인식하지 못하는 것 같습니다. (플러그인에서도 시도해 보았지만 결과는 동일했습니다.)
시도해 본 코드입니다:
javascripts/discourse/services/great-stuff.js:
import Service, { inject as service } from "@ember/service";
export default class GreatStuffService extends Service {
call() {
console.log('you called it')
}
}
@david: 이 설명과 코드 예제에 대해 정말 감사합니다. 덕분에 컴포넌트 내 버튼을 클릭하면 서비스에서 액션을 호출하도록 작동하게 만들었습니다. 큰 진전입니다.
이제 다른 절반을 정리하고 있습니다. 서비스에서 액션이 호출되면, 그것이 컴포넌트 내 액션을 트리거하도록 만드는 것입니다. 서비스에서 컴포넌트를 가져와서 해당 컴포넌트의 함수를 호출하고(또는 컴포넌트에서 액션을 구독하는) 방식이 아닐까 추측하고 있습니다. 하지만 아직 정확한 문법을 파악하지 못했습니다.
흥미롭네요! 후속 답변 감사합니다. 저는 Evented를 선호하지 않아요. 전에 사용해 본 적이 없고, Discourse 서비스에서 문법을 좀 헷갈려서: export default class GreatStuffService extends Service.extends(Evented, {...})
이렇게 쓰는 건 정확하지 않더라고요.
appEvents도 전에 사용해 본 적이 없습니다. 플러그인/테마 컴포넌트에서 새로운 appEvent를 생성한 후 구독할 수 있나요? 제가 찾은 대부분의 예제는 이미 Discourse 코어에 정의된 appEvents를 구독하는 것에 관한 것뿐이었거든요.