Modification : reclassé en bug.
Reproduction complète ci-dessous.
J’utilise api.modifyClass dans un composant de thème.
Sur la plupart des pages, cela fonctionne bien, mais dans certains sujets, la propriété n’est pas ajoutée au modèle utilisateur lors du rechargement de la page. Je ne trouve pas pourquoi cela fonctionne sur la plupart des sujets, mais pas sur certains, ni ce que les sujets où cela ne fonctionne pas ont en commun. Quelqu’un comprend-il ce que je fais mal ici ?
TL;DR L’ajout de api.container.lookup pour le modèle, en dessous de modifyClass, contourne ce problème.
C’est requis dans les versions ultérieures, j’ai d’ailleurs soumis des PR pour quelques thèmes hier afin d’ajouter cela. Je pourrais enfin me transformer en développeur de plugins/thèmes.
Merci Jay ! Cela a effectivement fait une différence sur mon instance de test.
Mais malheureusement, ce n’est pas une solution miracle universelle, le problème est toujours là
Oui, le pluginId est là pour éviter que les modifications ne soient appliquées deux fois, je crois. Son absence ne devrait pas expliquer pourquoi il n’a pas été exécuté une seule fois ?
Zut. Juste au moment où je pensais savoir quelque chose.
Je pensais que si quelque chose d’autre modifiait la classe, cela pourrait être une condition de concurrence pour voir lequel le faisait. Mais JavaScript reste encore en grande partie un mystère pour moi.
Je ne suis pas sûr que ces choses soient sémantiquement identiques…
… théoriquement, les deux devraient être évalués lors du rafraîchissement du navigateur, après quoi une condition de concurrence ne devrait plus poser de problème lors de la transition de route, car la modification devrait déjà avoir été appliquée…
Ok, j’ai vu une notification d’un post utile qui a apparemment été supprimé entre-temps.
La suggestion n’a pas fonctionné, mais elle contenait un indice qui m’a aidé à résoudre ce problème.
L’ajout de l’extrait suivant sous le code non fonctionnel a résolu de manière constante les problèmes que je rencontrais. Je l’ai testé sur plusieurs forums indépendants, sur stable et sur tests-passed. Je pense que cela devrait être reclassé comme 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
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 :
J’ai juste amélioré notre avertissement pour ce genre de situation :
et j’ai également rédigé cette documentation qui explique la cause et comment la résoudre :
Je pense que cela devrait répondre à toutes les préoccupations soulevées dans ce sujet. Sinon, veuillez partager un exemple de code défaillant et je l’examinerai.