У меня есть компонент Glimmer. Он работает. Но мне нужно, чтобы он размещался после первого поста в теме. Там нет выхода плагина.
Я понял, как вставить текст в innerHTML тега <article>, и это помещает текст туда, куда мне нужно, но, похоже, нет способа сделать то же самое с компонентом.
Не упускаю ли я что-то?
Я изучил, как плагин рекламы вставляет рекламу между постами, но не до конца разобрался в этом.
Давайте добавим его! Где бы вы хотели его разместить?
(существуют устаревшие способы достижения того, что вы делаете, но они перестанут работать, когда мы модернизируем просмотр тем. Если мы добавим выход для плагинов, это будет гораздо более устойчивым к будущим изменениям)
Пост передается как один из аргументов выхода, поэтому вы можете проверить post.post_number == 1
Ха-ха! Всегда рад помочь с такими вопросами. Гораздо лучше для всех, если темы и плагины будут использовать стандартные API, как в этом случае, а не обходные пути через виджеты (которые будут устаревшими в ближайшем будущем).
Да, это справедливо. Добавление их внутри виджетов — головная боль на стороне ядра. Но со стороны темы или плагина это должно быть очень чисто
Я постараюсь разобраться с этими сбоями тестов и завтра объединю PR. (Похоже, лишний HTML-элемент мешает некоторым хрупким селекторам в тестах QUnit)
Боюсь, я, возможно, был немного излишне оптимистичен здесь, @pfaffman, извините! Мой PR привел бы к появлению нового обертки <div> между каждым сообщением, даже если outlet не используется. Это не то, что мы хотим делать.
Возможно, есть способы избежать создания обертки… но ничего простого, что мы могли бы сделать немедленно.
Поэтому я думаю, что лучшее немедленное решение для вас — скопировать реализацию плагина adplugin, на которую вы сослались в исходном посте.
По сути:
Создайте компонент (Glimmer или классический, не имеет значения), который рендерит то, что вам нужно.
Используйте registerWidgetShim, чтобы сделать этот компонент доступным как виджет. Пример с adplugin создает виджет с именем “after-post-ad”, который рендерит компонент PostBottomAd. Он передает все атрибуты виджета (@data) в аргумент @model компонента.
Используйте api.decorateWidget, чтобы отрендерить ваш новый виджет-обертку в позиции post:after. В вашем случае, поскольку вам нужно это только для первого сообщения, вы можете сделать что-то вроде:
Когда мы в конечном итоге переведем страницу темы на Glimmer, вам нужно будет удалить обертку-виджет/декорацию и заменить её на плагин-аутлет. Это должно быть довольно просто, так как вся логика отображения в вашем компоненте будет переиспользована в плагин-аутлете.
Дайте нам знать, как у вас получится! Мы рады помочь с любыми последующими вопросами — знаю, что здесь много движущихся частей.
В данном случае, думаю, вам не нужно импортировать класс Service. Это потребуется только если вы создаёте собственный сервис. Вам нужен только декоратор внедрения service.
В последней версии Discourse/Ember это можно упростить ещё больше, чтобы не использовать псевдоним inject as. Ember теперь предоставляет декоратор внедрения напрямую как service.
import { service } from "@ember/service";
(но старый вариант { inject as service } всё ещё работает, и мне неизвестно о каких-либо планах по его устареванию в Ember)
РЕДАКТИРОВАНИЕ: Но, возможно, я могу использовать decorateWidget вместо выходного порта плагина…