Canapin
(Coin-coin le Canapin)
10월 22, 2020, 3:13오후
1
안녕하세요.
Discourse에서 페이지를 전환할 때, 표면적으로 나타나는 단계는 다음과 같습니다:
링크를 클릭합니다.
현재 콘텐츠가 사라지고 로더가 표시됩니다.
URL이 업데이트되고 새 콘텐츠가 표시됩니다.
홈으로 이동하는 경우는 약간 다릅니다. 홈으로 이동할 때는 새 콘텐츠가 표시될 때가 아니라, 현재 콘텐츠가 사라질 때 URL이 홈 URL로 변경됩니다.
제 목표는 Discourse에서 어떤 페이지 링크를 클릭하는 즉시 실행되는 스크립트를 만드는 것입니다.
api.onPageChange는 이 경우 적합하지 않습니다. 이 코드는 새 페이지 콘텐츠가 로드되는 시점과 거의 동시에 실행되기 때문입니다.
이를 위한 Discourse 메서드가 있을까요? 이벤트 트리거를 살펴봤지만, 제가 필요한 것과 일치하는 것을 찾지 못했습니다.
Johani
(Joe)
10월 22, 2020, 6:12오후
2
안녕하세요
기억하기로는 이전에 이런 요청이 있었던 적이 없어, 현재 Plugin-API에는 페이지 전환 전에 스크립트를 실행할 수 있는 방법이 없습니다.
그럼에도 불구하고, 애플리케이션 루트에서 willTransition() 액션을 활용할 수 있습니다.
테마/컴포넌트에서 다음과 같은 코드를 사용할 수 있습니다.
// 이것은 전환 후에 실행됩니다
api.onPageChange((url, title) => {
console.log("after transition");
});
// 이것은 전환 직전에 실행됩니다
api.modifyClass("route:application", {
pluginId: "some-name",
actions: {
willTransition() {
// 먼저 코어 코드를 실행합니다
this._super(...arguments);
// 그 다음 작업을 수행합니다
console.log("before transition");
// _router와 같이 사용할 수 있는 데이터를 확인하기 위해 다음과 같은 것도 할 수 있습니다
console.log(this)
}
}
});
이것이 주제 목록에서 주제로 진입할 때 실행되지 않는 것 같습니다.
다음과 같이 하나를 추가해서 시도해 보기도 했습니다:
api.modifyClass("route:topic", {
pluginId: PLUGIN_ID,
actions: {
willTransition() {
하지만 이것도 실행되지 않습니다.
david
(David Taylor)
11월 4, 2024, 12:04오후
5
작동하지 않을 수 있는 몇 가지 이유가 있습니다:
해시(hash)에 액션을 넣는 것은 더 이상 Discourse에서 사용하지 않는 구식 문법입니다. 이론적으로는 작동해야 하지만, 새 문법과의 상호운용성이 완벽하지 않을 수 있습니다. 현대적인 방식은 다음과 같습니다.
api.modifyClass("route:application", (Superclass) => class extends Superclass {
@action
willTransition(){
console.log("do something");
super.willTransition(...arguments);
}
});
표준 modifyClass 주의사항이 적용됩니다: 이는 위험하며 언제든지 깨질 수 있습니다.
willTransition가 모든 상황에서 application route에서 항상 발화되는 것은 보장되지 않는다고 생각합니다. (예: 자식 route에 willTransition 액션이 있는 경우, 반드시 버블업되지는 않습니다)
대신 Ember router 서비스의 이벤트를 사용하는 것을 권장합니다: RouterService | 5.12.0 | Ember API Documentation
예를 들어, 다음과 같은 방식으로 사용할 수 있습니다:
const router = api.container.lookup("service:router");
router.on("routeWillChange", () => {
console.log("route will change fired");
});
좋아요, 데이비드 감사합니다. 다음에 그 방법을 시도해 볼게요!
이 조사는 (음) 모든 페이지 변경 시, 그리고 Render 이전 에 무언가를 실행하는 방법이 필요했기 때문에 시작되었습니다.
페이지 변경 API 이벤트가 페이지 요소가 렌더링되기 전에 항상 발화되는지는 보장되지 않는 것 같습니다.
david
(David Taylor)
11월 4, 2024, 12:13오후
7
이것을 완벽하게 구현하는 것은 어려울 것 같습니다. Ember는 렌더링에 대한 완전한 제어를 유지하기를 기대하기 때문에, 임의의 지점에 후킹(Hook)을 시도하는 것은 힘들 수 있으며, 문제가 발생할 수도 있습니다(시도하려는 작업에 따라 다름).
물론 최종 목표가 무엇인지 저는 알지 못합니다… 따라서 그 고통이 정당화될 수도 있습니다. 그렇다면: 저를 무시하셔도 됩니다
(물론, 해결하려는 문제에 대해 Development 토픽을 열기를 원하신다면, 기꺼이 살펴볼 것입니다)
코드가 오픈 소스이므로 명시적으로 말씀드릴 수 있습니다:
제3자 광고 제공업체와 협력 중인데, 이쪽에서 자바스크립트로 광고 페이지 리셋 기능이 있습니다. 새 페이지의 광고가 트리거되기 전에 이 기능을 실행해야 합니다.
개선 사항이 있으면 환영하며, 이미 Johani의 코드를 통해 토픽 목록(Topic List)에서 이를 인지하고 있습니다. (오픈된 PR에 반영되어 있습니다.)
하지만 이 경우 토픽(Topic)은 … 다음으로 제안을 시도해 보고, 상황이 더 나아진다면 두 곳 모두에 적용해 보겠습니다.
david
(David Taylor)
11월 4, 2024, 12:20오후
9
아, 알겠습니다. 즉 DOM을 직접 수정하지 않는 거군요
그렇다면 routeWillChange가 작동할 것 같습니다. 다음 라우트가 렌더링되기 전에 반드시 트리거되니까요.
다만 주의할 점은… 리다이렉트 같은 경우 두 번 트리거될 수 있다는 것입니다. 또는 트리거된 후 전환이 중단될 수도 있습니다. 하지만 이 경우에는 괜찮을 수도 있습니다.
네, 메리필드 테크놀로지 타워(Merefield Technology Towers)에서는 그런 부끄러운 직접적인 DOM 수정 같은 짓은 하지 않거든요.
네, 서비스를 사용할게요. 그게 그 용도가 아니겠습니까! 결과를 다른 분들도 관심 있어 하실 것 같으니, 제 경험을 바탕으로 후기를 남겨볼게요.
네, 이제 정리되었고 두 경로 모두에서 작업이 올바른 순서로 수행됩니다.
도움 주셔서 감사합니다!