api.modifyClass が時々動作しない

バグとして再分類します。

modifyClass が呼び出されるたびにログに記録されるように、プラグイン API コード app/assets/javascripts/discourse/app/lib/plugin-api.jsconsole.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」が表示されます :partying_face:
「いいね!」 4