Ilia
(Ilia)
2021 年 9 月 8 日午後 3:20
1
こんにちは、
関数内から api.addPosterIcon を参照するには、どのようにすればよいでしょうか?
例:
<script type="text/discourse-plugin" version="0.8">
api.onPageChange(url => {
if (Discourse?.currentUser?.admin) {
extract_associated_user_data();
}
});
function extract_associated_user_data() {
// 上記に多くのコードがあり、ここで `addPosterIcon` 関数を呼び出す準備が整いました
api.addPosterIcon(function(data, attrs) {
return { icon: 'user', className: 'customer' };
});
}
</script>
api.addPosterIcon をトップレベルに移動させれば動作しますが、extract_associated_user_data 内から実行すると、何も起こらず(実行されず)静かに失敗します。おそらく内部で this が混乱しているのでしょうが、どのように参照すればよいのか確信が持てません。投稿する前に多くの試行を行いました。
将来的な開発者の読者の皆様にも役立つことを願っています。
Discourse の最新バージョン 2.8.0.beta6 (cba8b39607) を運用しています。
text/discourse-plugin スニペットのテーマへの実装は、おそらく以下の通りです:
js = <<~JS
import { withPluginApi } from "discourse/lib/plugin-api";
export default {
name: #{initializer_name.inspect},
after: "inject-objects",
initialize() {
withPluginApi(#{version.inspect}, (api) => {
#{node.inner_html}
});
}
};
JS
js_compiler.append_module(js, "discourse/initializers/#{initializer_name}", include_variables: true)
ここには this インスタンスの言及が直接見当たりません。これは JavaScript の暗黙的な this に関係していないことを示唆しており、スニペットがそこに貼り付けられている以上、api がスコープ外に出ている可能性もありません。
この最小限の例は実際に動作するのでしょうか?つまり、省略されたコードに問題があるわけではないのでしょうか?
参考までに:Discourse グローバル変数とその currentUser フィールドは、ここでも api.getCurrentUser() に置き換えることができます:
Ilia
(Ilia)
2021 年 9 月 8 日午後 4:48
3
ありがとうございます。
なぜ api.getCurrentUser() は関数内から問題なく動作するのに、api.addPosterIcon はまだ動作しないのでしょうか?
カスタムコードソリューションを書くのではなく、ネイティブ API を可能な限り活用したいと考えています(カスタムコード自体は問題ありませんが)。