Frage

Ich habe eine Form eines Publisher / Subscriber-Entwurfsmusters in jQuery zu implementieren. Ich baue grundsätzlich Klassen in Javascript Coffeescript verwendet wird, die als Komponenten auf meiner Seite dienen. das heißt Navigation, Datalist, etc.

Stattdessen DOM-Elemente Feuer Ereignisse zu haben, ich habe Instanzen dieser Klassen, dass die Verwendung Trigger auf sich benutzerdefinierte Ereignisse zu senden. Diese Instanzen können dann einander zuhören und die DOM-Elemente, die sie besitzen aktualisieren können entsprechend auf der Grundlage der Änderungen in das Verhalten der anderen!

Ich weiß, dass dies funktioniert, wie ich einen meiner Komponenten habe richtig ein benutzerdefiniertes Ereignis ausgelöst wird. Allerdings habe ich in einem Baumstumpf lief. Ich habe eine andere Komponente erstellt und für das Leben von mir kann ich nicht herausfinden, warum es die Veranstaltung nicht gefeuert wird.

Dies ist die Umsetzung meiner Klasse:

window.List = (function() {
    List = function(element, settings) {
      var _a, _b, _c;
      this.list = $(element);
      this.settings = jQuery.extend(List.DEFAULTS, settings);
      this.links = this.list.find(this.settings.link_selector);
      this.links.selectable();
      _b = [SelectableEvent.COMPLETED, SelectableEvent.UNDONE, SelectableEvent.SELECTED, SelectableEvent.DESELECTED];
      for (_a = 0, _c = _b.length; _a < _c; _a++) {
        (function() {
          var event_type = _b[_a];
          return this.links.bind(event_type, __bind(function(event, selectable_event) {
            return this.dispatch(selectable_event);
          }, this));
        }).call(this);
      }
      return this;
    };
    List.DEFAULTS = {
      link_selector: "a",
      completed_selector: ".completed"
    };
    List.prototype.change = function(mode, previous_mode) {
      if (mode !== this.mode) {
        this.mode = mode;
        if (previous_mode) {
          this.list.removeClass(previous_mode);
        }
        return this.list.addClass(this.mode);
      }
    };
    List.prototype.length = function() {
      return this.links.length;
    };
    List.prototype.remaining = function() {
      return this.length() - this.list.find(this.settings.completed_selector).length;
    };
    List.prototype.dispatch = function(selectable_event) {
      $(this).trigger(selectable_event.type, selectable_event);
      return alert(selectable_event.type);
    };
    return List;
}).call(this);

Beachten Sie:

List.prototype.dispatch = function(selectable_event) {
    $(this).trigger(selectable_event.type, selectable_event);
    return alert(selectable_event.type);
};

Dieser Code ausgelöst richtig und gibt den erwarteten Ereignistyp über einen Alarm. Aber bevor der Alarm wird erwartet, ein benutzerdefiniertes Ereignis auf sich selbst auszulösen. Dies ist, wo ich mein Problem bin zu stoßen.

$(document).ready(function() {
    var list_change_handler, todo_list;
    todo_list = new List("ul.tasks");
    list_change_handler = function(event, selectable_event) {
      return alert("Hurray!");
    };
    $(todo_list).bind(SelectableEvent.COMPLETED, list_change_handler);
    $(todo_list).bind(SelectableEvent.UNDONE, list_change_handler);
    $(todo_list).bind(SelectableEvent.SELECTED, list_change_handler);
    $(todo_list).bind(SelectableEvent.DESELECTED, list_change_handler);
}

Sie sehen hier die Warnung „Hurra“ ist, was ich Feuer will, aber leider bin ich hier kein Glück. Ironischer habe ich genau das gleiche mit einer anderen Klasse getan, um die gleiche Art und Weise implementiert ein benutzerdefiniertes Ereignis ausgelöst wird und der Hörer es gerade fein empfängt. Alle Ideen, warum dies nicht funktionieren würde?

Update:

Per in den Kommentaren zu diskutieren, es sieht aus wie Logging „this“ in der Konsole das JS-Objekt gibt die Klasse darstellt. Aber logging „$ (this)“ gibt ein leeres jQuery-Objekt, würden somit Auslöser nie abgefeuert werden. Irgendwelche Gedanken auf, warum $ (this) aufkommt leer, wenn „dies“ genau die Instanz der Klasse zurückzukehren?

War es hilfreich?

Lösung

Ich fand heraus, dass jQuery konnte nicht indizieren meine Aufgabe, da die Klasse seine eigene Version einer jQuery-Methode implementiert. In diesem Fall wird die Länge (). Umbenennen der Länge () -Methode total () das Problem vollständig und jede Instanz der Klasse aufgelöst können erfolgreich Triggerereignisse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top