如何修改 Ember 路由类

大家好,
我想以我们使用 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 类?

我相信这是可行的——我认为它是通过 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

出现此错误是因为你的代码中未定义 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");

尽管如此,我强烈建议你花些时间阅读以下内容:

并尝试这种创建主题的新方法。这样能更轻松地参考核心代码中的示例。