api.modifyClass funktioniert manchmal(!) nicht

Klassifizierung als Fehler.

Ich habe ein console.log im Plugin-API-Code app/assets/javascripts/discourse/app/lib/plugin-api.js hinzugefügt, damit protokolliert wird, wann immer modifyClass aufgerufen wird.

Ich habe alle externen Plugins entfernt, um sicherzustellen, dass es keine Konflikte gab.

Reproduktion:

  • Erstellen Sie ein leeres Forum auf stable (also ohne Ember CLI). Dies funktioniert auch nicht auf tests-passed (ohne Ember CLI). Ich habe dies nicht mit Ember CLI getestet.

  • Fügen Sie eine Themenkomponente mit Folgendem in Common - Head hinzu:

#1 Funktioniert


    api.modifyClass('model:user', {
      pluginId: 'test-tc',
      testFunction: function() {
        return 1;
      }
    });

  • Laden Sie die Startseite

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

  • Geben Sie Discourse.currentUser.testFunction() in die Konsole ein

  • “1” wird ausgegeben

#2 Schlägt fehl

  • Gehen Sie zu einem Thema, z. B. ‘Welcome to Discourse’, und laden Sie die Seite neu
  • Die Konsole zeigt dieselben “modifyClass called”-Logs an
  • Geben Sie Discourse.currentUser.testFunction() in die Konsole ein
  • Uncaught TypeError: Discourse.currentUser.testFunction is not a function wird ausgegeben

#3 Schlägt fehl mit Warnung

  • Hängen Sie eine einzelne Zeile am Anfang der Themenkomponente an, sodass sie wie folgt aussieht:

    const userModel = api.container.lookup("model:user");

    api.modifyClass('model:user', {
      pluginId: 'test-tc',
      testFunction: function() {
        return 1;
      }
    });

  • Gehen Sie zu einem Thema, z. B. ‘Welcome to Discourse’, und laden Sie die Seite neu
  • Die Konsole zeigt dieselben “modifyClass called”-Logs an
  • Die Konsole zeigt eine Warnung „model:user“ wurde bereits im Container zwischengespeichert. Änderungen werden nicht angewendet.
  • Geben Sie Discourse.currentUser.testFunction() in die Konsole ein
  • Uncaught TypeError: Discourse.currentUser.testFunction is not a function wird ausgegeben

#4 Funktioniert

  • Verschieben Sie die Lookup-Zeile an das Ende der Themenkomponente, sodass sie wie folgt aussieht:

    api.modifyClass('model:user', {
      pluginId: 'test-tc',
      testFunction: function() {
        return 1;
      }
    });

    const userModel = api.container.lookup("model:user");

  • Gehen Sie zu einem Thema, z. B. ‘Welcome to Discourse’, und laden Sie die Seite neu
  • Die Konsole zeigt dieselben “modifyClass called”-Logs an
  • Geben Sie Discourse.currentUser.testFunction() in die Konsole ein
  • “1” wird ausgegeben :partying_face:
4 „Gefällt mir“