reopenWidget 抛出错误

我正在尝试理解Discourse 主题开发入门指南中的 reopenWidget() 函数,当我尝试使用 home-logo 代码片段创建一个主题组件时,我遇到了 Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'offsetHeight') 错误,这破坏了页面布局。是 reopenWidget() 的使用方式发生了变化,还是我遗漏了什么?

1 个赞

您介意分享您遇到问题的代码片段吗?

2 个赞

就是这个:

<script type="text/discourse-plugin" version="0.8.13">
api.reopenWidget("home-logo", {
  logo() {
    const { siteSettings } = this,
      { iconNode } = require("discourse/helpers/fa-icon-node"),
      h = require("virtual-dom").h,
      altLogo = settings.Alternative_logo_url,
      altLogoSmall = settings.Alternative_small_logo_url,
      mobileView = this.site.mobileView,
      mobileLogoUrl = siteSettings.mobile_logo_url || "",
      showMobileLogo = mobileView && mobileLogoUrl.length > 0;
    (logoUrl = altLogo || ""),
    (title = siteSettings.title);
    if (!mobileView && this.attrs.minimized) {
      const logoSmallUrl = altLogoSmall || "";
      if (logoSmallUrl.length) {
        return h("img#site-logo.logo-small", {
          key: "logo-small",
          attributes: { src: logoSmallUrl, width: 33, height: 33, alt: title }
        });
      } else {
        return iconNode("home");
      }
    } else if (showMobileLogo) {
      return h("img#site-logo.logo-big", {
        key: "logo-mobile",
        attributes: { src: mobileLogoUrl, alt: title }
      });
    } else if (logoUrl.length) {
      return h("img#site-logo.logo-big", {
        key: "logo-big",
        attributes: { src: logoUrl, alt: title }
      });
    } else {
      return h("h1#site-text-logo.text-logo", { key: "logo-text" }, title);
    }
  }
});
</script>

我直接从 Beginner’s GuidereopenWidget 部分复制过来的,没有做任何修改,然后在一个新的主题组件中,除了这个代码什么都没加。(并且仔细检查过我把代码放到了 Header 部分)。

我安装了几个其他的主题组件,但没有一个会触及 home-logo。我使用的是基础托管,这可能会有影响吗?我以为可能是因为我没有上传深色标志,但即使上传了深色标志,问题依然存在。

1 个赞

这里事情的进展很快。

基本问题可能是你复制了指南中的代码,而不是遵循说明。

这是你刚才分享的代码与当前源代码的比较:

也就是说,它们非常不同!(因此很可能出错!)

你需要做的是(按照说明),转到源代码并复制当前代码,然后根据你的需要进行更改。

换句话说,指南中的代码已经过时了,即使说明没有过时,但说明仍然有效。

2 个赞

好的,谢谢!这是我第一次使用 Discourse 或 Ember,还在熟悉中。我曾尝试使用 reopenWidget 和从当前源复制的另一个函数,但未能成功,我会再多尝试一下。