Hinzufügen eines Formulars zu einem Plugin

Ich versuche, ein einfaches Plugin zu erstellen, das

  • ein Formular über der Themen-Timeline hinzufügt
  • die vom Benutzer eingegebene E-Mail-Adresse an einen Controller POSTet

Das Formular wird über der Timeline gerendert, aber wenn ich eine E-Mail eingebe und auf die Schaltfläche “Senden” klicke, erhalte ich diese Fehlermeldung in der Browserkonsole:

DEBUG: -------------------------------
vendor.js:49192 DEBUG: Ember  : 3.15.0
vendor.js:49192 DEBUG: jQuery : 3.6.0
vendor.js:49192 DEBUG: -------------------------------
vendor.js:4180 [Violation] 'setTimeout' handler took 489ms
[Violation] Forced reflow while executing JavaScript took 35ms
vendor.js:49192 DEBUG: For more advanced debugging, install the Ember Inspector from https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi
user-presence.js:77 [Violation] 'setInterval' handler took 51ms
vendor.js:49170 Uncaught Error: Assertion Failed: <@ember/component:ember716> had no action handler for: lonerWatch
    at assert (vendor.js:49170)
    at Class.send (vendor.js:44642)
    at Class.superWrapper [as send] (vendor.js:43919)
    at Class.send (plugin-connector.js:75)
    at Class.superWrapper [as send] (vendor.js:43919)
    at vendor.js:22103
    at instrument (vendor.js:50635)
    at vendor.js:22102
    at Backburner._run (vendor.js:67048)
    at Backburner._join (vendor.js:67024)

Der (derzeit unvollständige) Code lautet:

/assets/javascripts/discourse/templates/connectors/topic-navigation/loner-watch-topic-form.hbs

<form {{action 'lonerWatch' on='submit'}}>
    <p>Enter your email address to watch this topic for updates</p>
    <input name="email" placeholder="Your email"/>
    <button>Watch</button>
</form>

/assets/javascripts/discourse/controllers/loner-watch-topic-form.js.es6

export default Ember.Controller.extend({
    actions: {
      lonerWatch(content) {
        console.log(content);
      }
    }
  });

/controllers/loners_controller.rb

class LonersController < ApplicationController
   [...]
    # Watch topic as a staged user
    def watch
      user = ensure_user
      topic = Topic.find(params[:topic_id].to_i)
      TopicUser.change(user, topic.id, notification_level: params[:notification_level].to_i)
    end
  end

Ich bin sicher, dass ich etwas Einfaches übersehe, aber ich sehe es einfach nicht. Jede Hilfe wird geschätzt.

1 „Gefällt mir“

Mir ist gerade aufgefallen, dass /assets/javascripts/discourse/controllers /assets/javascripts/discourse/components sein sollte. Leider erhalte ich immer noch dieselbe Fehlermeldung.

Ich bin ratlos. Hat jemand eine Idee, was ich hier falsch mache?

Die Connector-Vorlage und die JS-Datei müssen sich im selben Verzeichnis befinden und denselben Namen haben. Also
/assets/javascripts/discourse/connectors/topic-navigation/loner-watch-topic-form.hbs

<form {{action 'lonerWatch' content on='submit'}}>    
    <p>Geben Sie Ihre E-Mail-Adresse ein, um dieses Thema auf Aktualisierungen zu abonnieren</p>
    <input name="email" placeholder="Ihre E-Mail" />
    <button>Beobachten</button>
</form>

und
/assets/javascripts/discourse/connectors/topic-navigation/loner-watch-topic-form.js

export default {
  actions: {
    lonerWatch(content) {
      console.log(content);
    },
  },
};

Ihre Aktion sollte dann funktionieren. Sie können hier mehr darüber lesen, wenn Sie interessiert sind.

5 „Gefällt mir“

Danke für die Antwort. Es funktioniert jetzt. Es scheint, dass ich mehrere Dinge falsch gemacht habe, aber das Schlimmste war die fälschliche Verwendung von Ember.Controller.extend, wenn es nicht benötigt wurde.

2 „Gefällt mir“