Problèmes pour remplacer les getters dans un contrôleur (3.0.0)

J’ai ce code dans mon initialiseur, il tente de remplacer le getter pour allAdminRoutes :

    api.modifyClass('controller:admin-plugins', {
      pluginId: PLUGIN_ID,

      get allAdminRoutes() {
        return this.model
          .filter(p => p?.enabled)
          .map(p => {
            return p.admin_route;
          })
          .filter(Boolean);
      },
    });

Cela échoue avec :

TypeError: this.model is undefined

Maintenant, ça ne me dérangerait pas, mais c’est juste le code du getter original (je ne l’ai pas encore réellement modifié !)

Qu’est-ce qui me manque ? Est-ce que le remplacement d’un getter de cette manière n’est pas pris en charge ou introduit-il un problème de portée ?

4 « J'aime »

Étrangement, cela ne semble pas être un problème avec la dernière version. (Ce n’était qu’un test sur la production.)

Je vais voir si je peux le reproduire sur une version stable 3.0.0 propre.

1 « J'aime »

L’exemple devrait fonctionner, et je ne suis au courant d’aucun changement pertinent entre la version stable et maintenant. Faites-nous savoir si vous parvenez à reproduire le problème !

1 « J'aime »

Merci David. Je vais le faire. Oui, j’ai remarqué cela. La balle est définitivement dans mon camp pour le moment car l’environnement dans lequel j’ai vécu cela n’était pas entièrement propre.

1 « J'aime »

OK David, il semble (et c’est étrange) :

  • fonctionne en Production
  • échoue en Développement 3.0.0 et versions ultérieures (possiblement avant)
  • J’ai testé dans un environnement de développement sans Docker et aussi dans un environnement de développement Docker personnalisé très propre (mais potentiellement incomplet en configuration).

Voici les erreurs :

Erreur survenue :

- Lors du rendu :
  -niveau supérieur
    application
      discourse-root
        sidebar-wrapper
          admin
            admin-wrapper
              nav-item
                link-to
                  -link-to
Uncaught (in promise) TypeError : lors de la génération du lien vers la route "adminPlugins" : this.model is undefined
    get allAdminRoutes admin-plugins.js:20

notez que je peux placer une instruction de débogage avant le return this.model et le débogueur ne se déclenche jamais.

@RGJ a également gentiment examiné cela et peut reproduire ce résultat.

C’est un peu un problème car nous devons clairement développer des choses avant qu’elles n’arrivent en production… mais je n’ai pas à vous le dire ! :sweat_smile: C’est aussi un peu ennuyeux que ce soit un problème sur Stable…

Déplacé vers Bug pour l’instant…

2 « J'aime »

OK, nous sommes encore plus sûrs qu’il y a un problème ici… puisque mergeMixins est mentionné dans la trace de la pile

(merci à @RGJ d’avoir trouvé cela)

4 « J'aime »

Bien joué - merci @merefield et @RGJ

Je ne suis pas sûr de ce que nous pouvons faire pour corriger cela dans Discourse - comme vous l’avez noté, le problème semble être en amont dans Ember. Peut-être pouvons-nous patcher la méthode problématique :thinking:

Pour commencer, j’ai ajouté un cas de test minimal échoué afin que nous puissions suivre les progrès. Il y a quelques commentaires dans le test qui décrivent pourquoi le problème est déclenché par notre système modifyClass :

4 « J'aime »

Oui, merci pour vos efforts également. C’est étrange qu’ils aient laissé ce problème sans réponse ? Sait-on si (Ember) 4.x le résoudra ?

Malheureusement, il semble que le problème existe toujours dans Ember 4.x :cry:

1 « J'aime »

Assez drôlement, cela semble être le seul progrès au sein du projet Ember, dans la PR associée qui est toujours en Draft. Je me demande si tout ce qui serait nécessaire serait une demande polie pour lui donner la priorité quand le temps sera disponible ? :

J’apprécie pleinement que cela ait été ouvert par un membre du personnel d’un tiers.

Vaut-il la peine de soulever un problème sur GitHub - emberjs/ember.js: Ember.js - A JavaScript framework for creating ambitious web applications et de référencer cette PR, ce sujet et votre test ?

Oui, mon test est basé sur le leur (mais avec l’API api.modifyClass spécifique à Discourse). Je ne pense pas que nous devrions ouvrir un nouveau ticket – c’est 100% identique à celui qui est déjà ouvert. Nous verrons si nous pouvons faire quelque chose pour le prioriser.

3 « J'aime »

Je fais des progrès ici - nous avons maintenant une PR avec un correctif ouvert sur [BUGFIX LTS] Don't run getters while applying mixins by wycats · Pull Request #20388 · emberjs/ember.js · GitHub

Une fois que cela sera fusionné et rétroporté vers Ember 3.28, nous viserons à l’appliquer à Discourse dès que possible.

3 « J'aime »

Rétroporté ?! Je me posais la question, excellente nouvelle !

Merci d’avoir mené ce projet à bien David !

Cette correction a maintenant été publiée dans le cadre d’Ember 3.28.12, et nous avons mis à jour Discourse pour l’utiliser. Veuillez nous faire savoir si vous rencontrez toujours des problèmes avec modifyClass après la mise à jour vers la dernière version de Discourse.

6 « J'aime »

Super David, merci beaucoup !

2 « J'aime »

Ce sujet a été automatiquement fermé après 9 jours. De nouvelles réponses ne sont plus autorisées.