每次创建或安装主题或组件时,Discourse 都会为其分配一个 ID。如果您访问该组件的页面,应该可以在 URL 中看到该 ID(末尾的数字)。
![]()
当该组件被添加到您的主题中时,其执行顺序似乎是基于其 ID 的——在最基本的层面上(在不进行任何延迟的情况下执行 console.log)。因此,233 会在 234 之前运行,依此类推。
这在大多数情况下都能正常工作,因为后续的更改通常会被添加到新组件中,因此一切正常。
从长远来看,我们可以让执行顺序遵循您在主题中添加的组件列表的顺序。
但目前这并不在任何路线图之中。
您真正需要的是初始化器的顺序。我认为,除非您将代码迁移到创建主题 JavaScript 的新方法,否则无法实现这一点。该方法允许您为初始化器指定名称和执行顺序。例如,假设我有这样一个文件:
/javascripts/discourse/initializers/initialize-for-foo.js
内容如下:
import { withPluginApi } from "discourse/lib/plugin-api";
export default {
name: "foo",
initialize() {
withPluginApi("0.8.7", api => {
console.log("foo")
});
}
}
我还有另一个初始化器,内容如下:
/javascripts/discourse/initializers/initialize-for-bar.js
import { withPluginApi } from "discourse/lib/plugin-api";
export default {
name: "bar",
initialize() {
withPluginApi("0.8.7", api => {
console.log("bar")
});
}
}
如果我希望确保 bar 在 foo 之后运行,我可以为其添加一个 after: 参数,这将确保它在所传递的初始化器名称之后运行。因此,要让 bar 在 foo 之后运行,我会在以下文件中这样做:
/javascripts/discourse/initializers/initialize-for-bar.js
import { withPluginApi } from "discourse/lib/plugin-api";
export default {
name: "bar",
+ after: "foo",
initialize() {
withPluginApi("0.8.7", api => {
console.log("bar");
});
}
};
