大家好,
我想以我们使用 pluginAPI 修改 Controller 和 Component 类的方式,来修改 Ember Route 类(/app/assets/javascripts/discourse/routes/tags-show.js.es6)。
以下是我们修改 composer.js.es6 控制器的示例:
<script type="text/discourse-plugin" version="0.8">
api.modifyClass('controller:composer', {
actions: {
newActionHere() { }
}
});
</script>
是否可以用同样的方式修改 Ember Route 类?
justin
(Justin DiRose)
2
我相信这是可行的——我认为它是通过 route:route-name 实现的。你试过吗?
route:route-name 可以正常工作,但当我尝试按如下所示覆盖 createTopic 操作时:
<script type="text/discourse-plugin" version="0.8">
api.modifyClass('route:tags-show', {
actions: {
createTopic() {
const controller = this.controllerFor("tags.show");
if (controller.get("list.draft")) {
this.openTopicDraft(controller.get("list"));
} else {
this.controllerFor("composer")
.open({
categoryId: controller.get("category.id"),
action: Composer.CREATE_TOPIC,
draftKey: controller.get("list.draft_key"),
draftSequence: controller.get("list.draft_sequence")
})
.then(() => {
// 预填充标签输入框
if (controller.get("model.id")) {
const composerModel = this.controllerFor("composer").get("model");
composerModel.set(
"tags",
_.compact(
_.flatten([
controller.get("model.id"),
controller.get("additionalTags")
])
)
);
}
});
}
}
}
});
</script>
它抛出了错误:
ReferenceError: Composer is not defined
Johani
(Joe)
4
出现此错误是因为你的代码中未定义 Composer。查看 tags-show 路由,你会发现 Composer 是在顶部定义的。
https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/routes/tags-show.js.es6#L2
不过,由于你是在主题脚本标签中操作,因此无法使用 import。你需要改用 require。
因此,如果你在代码顶部添加如下内容,问题应该就能解决:
const Composer = require("discourse/models/composer");
尽管如此,我强烈建议你花些时间阅读以下内容:
并尝试这种创建主题的新方法。这样能更轻松地参考核心代码中的示例。