# 收到新消息时更新小部件？

**URL:** https://meta.discourse.org/t/update-widget-when-new-message-received/250637
**Category:** Development
**Created:** [2023年一月4日 00:37 UTC](https://meta.discourse.org/t/update-widget-when-new-message-received/250637 "2023-01-04T00:37:52Z")
**Posts on this page:** 2
**Page:** 1

<div class="post-metadata">

### Author: ![piffy](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/piffy/32/254198_2.png) [@piffy](https://meta.discourse.org/u/piffy)
#### Post date: [2023年一月4日 00:37 UTC](https://meta.discourse.org/t/update-widget-when-new-message-received/250637/1 "2023-01-04T00:37:52Z")

</div>

我有一个主题组件小部件，当有新主题或未读主题时，它会显示一个小的气泡。为了实时更新，我这样做：

```
  topicTrackingState.onStateChange(() => {
    this.scheduleRerender();
  });

```

我想对私信（PM）做类似的事情。我可以使用 `new_personal_messages_notifications_count` 来获取用户的消息数量。但是，如果收到新消息，小部件不会自动重新渲染。有没有一种简单的方法可以在收到新消息时更新小部件，类似于上面的 `topicTrackingState`？

---

<div class="post-metadata">

### Author: ![piffy](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/piffy/32/254198_2.png) [@piffy](https://meta.discourse.org/u/piffy)
#### Post date: [2023年一月4日 03:01 UTC](https://meta.discourse.org/t/update-widget-when-new-message-received/250637/2 "2023-01-04T03:01:21Z")

</div>

所以我找到了一个可行的解决方案。显然，有一个私信版本的 TopicTrackingState。我花了一段时间才弄清楚它需要一个“key”作为参数，我不清楚这个 key 是做什么用的，但它接受了一个任意字符串而没有问题

```
  pmTopicTrackingState.onStateChange("pm-tracking-key", () => {
    this.scheduleRerender();
   });

```

这会触发重绘，但我注意到 `new_personal_messages_notifications_count` 没有及时更新以供重绘，因此它无法立即更新。

不过，我认为这对我来说是一个“足够好”的解决方案。通知最终会显示在小部件上。我很乐意听取对此的任何评论。
