在使用 Discourse 的 Ember API 插入 iframe 时遇到一些问题

这里有几点建议:

  • 站点设置已移至一个服务:

    const siteSettings = container.lookup('service:site-settings');
    if (!siteSettings.docuss_enabled) {
      return;
    }
    
  • location:discourse-locationlocation:history

  • afterRender().then(() => onAfterRender(container));
    afterRender 是一个装饰器,你将其放在组件类的方法上方;你不应该直接将其用作函数。
    我想你想要的是(似乎不需要),可能是:

    import { schedule } from '@ember/runloop';
    schedule("afterRender", () => onAfterRender(container))
    
  • 似乎有一大段代码不在 composeStateChanged 函数中。
    另外,你可以在这里使用路由服务:container.lookup('router:main').transitionTo(path);this.router.transitionTo(path);

  • 标题已现代化。在你的上下文中,home-logo 小部件中的自定义已弃用。更多信息请参见:https://meta.discourse.org/t/upcoming-header-changes-preparing-themes-and-plugins/296544。
    在你的情况下,你需要将 glimmer header mode 设置为 autoenabled。然后,你可以使用插件出口来替换内容:

    api.renderInOutlet("home-logo-contents", `
      <HomeLogoContents
        @logoSmallUrl={{container.dcsHeaderLogo._smallLogoUrl}}
        @logoUrl={{container.dcsHeaderLogo._logoUrl}}
        @minimized={{@outletArgs.minimized}}
        @mobileLogoUrl={{container.dcsHeaderLogo._mobileLogoUrl}}
        @showMobileLogo={{@outletArgs.showMobileLogo}}
        @title={{@outletArgs.title}}
      />
    `);
    

    注意:要使用 glimmer <template> 语法,请确保将文件扩展名重命名为 .gjs.
    你也可以使用这种方式:

     api.registerValueTransformer("home-logo-image-url", (transformer) => {
        let url = transformer.value;
        if (transformer.context.name === 'logo') {
          url = container.dcsHeaderLogo._logoUrl;
        } else if (transformer.context.name === 'logo_small') {
          url = container.dcsHeaderLogo._smallLogoUrl;
        } else if (transformer.context.name === 'logo_mobile') {
          url = container.dcsHeaderLogo._mobileLogoUrl;
        }
        return url;
      });
    

    要更改 URL:

    api.registerValueTransformer("home-logo-href", () => container.dcsHeaderLogo._href);
    

    注意:我认为在 setLogo 中重新渲染的代码在 glimmer 组件上将不起作用。

    注意(测试后):然而,这两种解决方案都将不起作用,因为标题在你可以从 JSON 中获取 logo 之前就已经渲染了。我没有现成的解决方案。我不确定是否有更好的方法:我会将 JSON 加载移到一个服务中并跟踪结果。然后,使用上面带有 glimmer 组件的插件出口。这样,基于一个跟踪变量,你可以自动触发组件的更新。

    这样,它在某种程度上是可行的。至少,没有更多的阻塞性错误了。:slightly_smiling_face:

    希望这有帮助。

3 个赞