大家好,
我们创建了一个名为“topic-timeline-bookmark”的小部件,它在 topic-timeline 小部件之后显示主题级别的书签按钮。
现在,当我们点击 topic-timeline 书签按钮时,会显示一个模态框以设置书签。保存书签后,它会更新 first-post-menu 按钮和 topic-footer-button 下的书签按钮,但除非刷新 topic-timeline 小部件(即滚动页面),否则它自身不会更新,反之亦然。
first-post-menu

topic-footer-button

我发现,每当设置或取消设置书签时,post-stream 小部件会被刷新,因此 post-menu 和 topic-footer-button 的书签按钮能够同步工作。
那么,我该如何在设置或取消设置书签时,或者在 post-stream 小部件刷新时,刷新我的“topic-timeline-bookmark”小部件呢?以下是我的代码:
<script type="text/discourse-plugin" version="0.8">
const { h } = require('virtual-dom');
const { getOwner } = require("discourse-common/lib/get-owner");
const topicController = getOwner(this).lookup("controller:topic");
api.createWidget("topic-timeline-bookmark", {
tagName: 'div.discourse-bookmark-button-wrapper',
buildKey: () => `topic-timeline-bookmark`,
toggleBookmark() {
topicController.send('toggleBookmark');
},
html(attrs, state) {
let contents = [];
const user = api.getCurrentUser();
if (user) {
let tooltip = 'bookmarked.help.bookmark';
let label = 'bookmarked.title';
let buttonClass = 'btn btn-default bookmark';
let icon = "bookmark";
let bookmarkedPosts = topicController.model.bookmarked_posts;
let bookmarkCount = 0;
if(bookmarkedPosts && bookmarkedPosts.length > 0){
bookmarkCount = bookmarkedPosts.length;
//图标
if (bookmarkedPosts.some((bookmark) => bookmark.reminder_at))
icon = "discourse-bookmark-clock";
else
icon = "bookmark";
//标签
if (bookmarkCount === 0)
label = "bookmarked.title";
else if (bookmarkCount === 1)
label = "bookmarked.edit_bookmark";
else
label = "bookmarked.clear_bookmarks";
//工具提示
if (bookmarkedPosts.length === 1)
tooltip = 'bookmarked.help.edit_bookmark';
else if (bookmarkedPosts.find((x) => x.reminder_at))
tooltip = 'bookmarked.help.unbookmark_with_reminder';
//如果已设置书签,则追加 CSS 类
if (bookmarkCount > 0) { buttonClass += ' bookmarked' }
}
contents.push(
this.attach('button', {
action: 'toggleBookmark',
title: tooltip,
label: label,
icon: icon,
className: buttonClass
})
);
}
return contents;
},
});
api.decorateWidget('topic-timeline:after', function(helper) {
return helper.attach('topic-timeline-bookmark');
});
</script>

