バグとして再分類します。
modifyClass が呼び出されるたびにログに記録されるように、プラグイン API コード app/assets/javascripts/discourse/app/lib/plugin-api.js に console.log を追加しました。
競合がないことを確認するために、すべての外部プラグインを削除しました。
再現手順:
-
stableで空のフォーラムを作成します(Ember CLI なし)。これは、テスト合格(Ember CLI なし)でも機能しません。Ember CLI ではテストしていません。 -
Common - Head に以下を追加したテーマコンポーネントを追加します。
#1 動作中
<script type="text/discourse-plugin" version="0.1">
api.modifyClass('model:user', {
pluginId: 'test-tc',
testFunction: function() {
return 1;
}
});
</script>
-
ホームページを読み込みます。
-
コンソールに
modifyClass called for model:user _application-08d9058ddd37ba80992f770509f4919ad0738a17f14fb85167b1dc1f32f8b56e.js:23490:16 Object { pluginId: "test-tc", testFunction: testFunction() }と表示されます。 -
コンソールで
Discourse.currentUser.testFunction()と入力します。 -
「1」が表示されます。
#2 失敗
- トピック(例:「Welcome to Discourse」)に移動し、ページを再読み込みします。
- コンソールに同じ「modifyClass called」ログが表示されます。
- コンソールで
Discourse.currentUser.testFunction()と入力します。 Uncaught TypeError: Discourse.currentUser.testFunction is not a functionと表示されます。
#3 警告付きで失敗
- テーマコンポーネントの先頭に 1 行追加して、以下のようになります。
<script type="text/discourse-plugin" version="0.1">
const userModel = api.container.lookup("model:user");
api.modifyClass('model:user', {
pluginId: 'test-tc',
testFunction: function() {
return 1;
}
});
</script>
- トピック(例:「Welcome to Discourse」)に移動し、ページを再読み込みします。
- コンソールに同じ「modifyClass called」ログが表示されます。
- コンソールに
\"model:user\" was already cached in the container. Changes won't be applied.という警告が表示されます。 - コンソールで
Discourse.currentUser.testFunction()と入力します。 Uncaught TypeError: Discourse.currentUser.testFunction is not a functionと表示されます。
#4 動作中
- lookup 行をテーマコンポーネントの 末尾 に移動して、以下のようになります。
<script type="text/discourse-plugin" version="0.1">
api.modifyClass('model:user', {
pluginId: 'test-tc',
testFunction: function() {
return 1;
}
});
const userModel = api.container.lookup("model:user");
</script>
- トピック(例:「Welcome to Discourse」)に移動し、ページを再読み込みします。
- コンソールに同じ「modifyClass called」ログが表示されます。
- コンソールで
Discourse.currentUser.testFunction()と入力します。 - 「1」が表示されます
