api.modifyClass ne fonctionne parfois (!) pas

Reclassification en tant que bug.

J’ai ajouté un console.log dans le code de l’API du plugin app/assets/javascripts/discourse/app/lib/plugin-api.js pour qu’il s’affiche chaque fois que modifyClass est appelé.

J’ai supprimé tous les plugins externes pour m’assurer qu’il n’y avait pas de conflit.

Reproduction :

  • Créez un forum vide sur stable (donc sans Ember CLI). Cela ne fonctionne pas non plus sur tests-passed (sans Ember CLI). Je n’ai pas testé avec Ember CLI.

  • Ajoutez un composant de thème avec ceci dans Commun - En-tête

#1 Fonctionne

<script type="text/discourse-plugin" version="0.1">
    api.modifyClass('model:user', {
      pluginId: 'test-tc',
      testFunction: function() {
        return 1;
      }
    });
</script>
  • Chargez la page d’accueil

  • La console affiche modifyClass called for model:user _application-08d9058ddd37ba80992f770509f4919ad0738a17f14fb85167b1dc1f32f8b56e.js:23490:16 Object { pluginId: "test-tc", testFunction: testFunction() }

  • Entrez Discourse.currentUser.testFunction() dans la console

  • “1” est affiché

#2 Échoue

  • Allez sur un sujet, par exemple ‘Welcome to Discourse’ et rechargez la page
  • La console affiche les mêmes logs “modifyClass called”
  • Entrez Discourse.currentUser.testFunction() dans la console
  • Uncaught TypeError: Discourse.currentUser.testFunction is not a function est affiché

#3 Échoue avec avertissement

  • Ajoutez une seule ligne en haut du composant de thème pour qu’il ressemble à ceci :
<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>
  • Allez sur un sujet, par exemple ‘Welcome to Discourse’ et rechargez la page
  • La console affiche les mêmes logs “modifyClass called”
  • La console affiche un avertissement "model:user" was already cached in the container. Changes won't be applied.
  • Entrez Discourse.currentUser.testFunction() dans la console
  • Uncaught TypeError: Discourse.currentUser.testFunction is not a function est affiché

#4 Fonctionne

  • Déplacez la ligne lookup en bas du composant de thème pour qu’il ressemble à ceci :
<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>
  • Allez sur un sujet, par exemple ‘Welcome to Discourse’ et rechargez la page
  • La console affiche les mêmes logs “modifyClass called”
  • Entrez Discourse.currentUser.testFunction() dans la console
  • “1” est affiché :partying_face:
4 « J'aime »