这里有几点建议:
-
站点设置已移至一个服务:
const siteSettings = container.lookup('service:site-settings'); if (!siteSettings.docuss_enabled) { return; } -
location:discourse-location→location: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设置为auto或enabled。然后,你可以使用插件出口来替换内容: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 组件的插件出口。这样,基于一个跟踪变量,你可以自动触发组件的更新。
这样,它在某种程度上是可行的。至少,没有更多的阻塞性错误了。

希望这有帮助。