我的初始化程序中有这段代码,它试图覆盖 allAdminRoutes 的 getter:
api.modifyClass('controller:admin-plugins', {
pluginId: PLUGIN_ID,
get allAdminRoutes() {
return this.model
.filter(p => p?.enabled)
.map(p => {
return p.admin_route;
})
.filter(Boolean);
},
});
它失败了,错误是:
TypeError: this.model is undefined
现在,我倒是不介意,但这只是原始的 getter 代码(我还没有真正更改它!)
我错过了什么?以这种方式覆盖 getter 是否不受支持,或者它会引入某种作用域问题?
4 个赞
奇怪的是,这似乎不是最新版本的问题。(那只是在生产环境中进行的测试。)
我将尝试在干净的 3.0.0 稳定版上重现此问题。
1 个赞
david
(David Taylor)
4
这个示例应该可以工作,而且我不知道稳定版发布到现在有什么相关的更改。如果您能重现该问题,请告知我们!
1 个赞
谢谢你,大卫。我会照做的。是的,我注意到了。现在球肯定在我这边,因为我遇到这种情况的环境并不完全干净。
1 个赞
好的 David,看起来(而且这很奇怪):
- 在 Production 中可以正常工作
- 从 3.0.0 版本开始在 Development 中失败(可能更早)
- 我已在纯粹的非 Docker 开发环境中进行测试,也在一个非常干净(但可能配置不完整)的定制 Docker 开发环境中进行测试。
这是错误:
发生错误:
- 渲染时:
- 顶层
application
discourse-root
sidebar-wrapper
admin
admin-wrapper
nav-item
link-to
-link-to
未捕获(在 Promise 中)TypeError:在生成指向路由“adminPlugins”的链接时:this.model 为 undefined
get allAdminRoutes admin-plugins.js:20
请注意,我可以在 return this.model 之前放置一个调试器语句,但调试器从未触发。
@RGJ 也好心地查看了这个问题,并可以重现此结果。
这有点麻烦,因为显然我们需要在产品上线前开发东西……但我不用告诉你这个!
另外,在 Stable 版本上出现这个问题也有些令人恼火……
暂时移至 Bug …
2 个赞
好的,我们更加确定这里存在问题……因为堆栈跟踪中提到了 mergeMixins
(感谢 @RGJ 发现此问题)
4 个赞
david
(David Taylor)
10
干得漂亮——谢谢 @merefield 和 @RGJ
我不确定我们能在 Discourse 中做多少来修复这个问题——正如你所注意到的,问题似乎在上游的 Ember 中。也许我们可以修补有问题的函数 
为了让我们开始,我添加了一个最小的失败测试用例,以便我们可以跟踪进度。测试中有一些注释描述了为什么我们的 modifyClass 系统会触发此问题:
4 个赞
也感谢你的努力。他们就这样放着那个问题不管,这很奇怪?我们知道 (Ember) 4.x 会解决它吗?
有趣的是,这似乎是 Ember 项目唯一的进展,在相关的 PR 中,该 PR 仍处于草稿状态。我想知道是否只需要在有时间时礼貌地请求优先处理它?:
完全理解这是由第三方员工提出的。
是否值得在 GitHub - emberjs/ember.js: Ember.js - A JavaScript framework for creating ambitious web applications 上提出一个 issue,并引用这个 PR、这个主题和你的测试?
david
(David Taylor)
14
是的,我的测试基于他们的测试(但使用了特定于 discourse 的 api.modifyClass API)。我认为我们不应该开一个新 issue——这与已打开的 issue 100% 相同。我们会看看是否能做些什么来优先处理它。
3 个赞
david
(David Taylor)
15
3 个赞
david
(David Taylor)
18
此修复程序已作为 Ember 3.28.12 的一部分发布,我们已更新 Discourse 来使用它。如果您在更新到最新的 Discourse 后仍然遇到 modifyClass 的任何问题,请告知我们。
6 个赞