Domanda

Ho attuato una forma di un modello di progettazione editore / sottoscrittore in jQuery. Sono fondamentalmente la costruzione di classi in JavaScript utilizzando CoffeeScript che servono come componenti sulla mia pagina. vale a dire di navigazione, DataList, ecc.

Invece di avere elementi DOM eventi di fuoco, ho le istanze di queste classi che l'uso di trigger su se stessi per inviare gli eventi personalizzati. Queste istanze possono poi ascoltare l'altro e possono aggiornare gli elementi DOM che possiedono di conseguenza sulla base delle variazioni di ogni comportamento degli altri!

So che questo funziona come io ho uno dei miei componenti dispacciamento un evento personalizzato in modo corretto. Tuttavia, ho incontrato un intoppo. Ho creato un altro componente e per la vita di me non riesco a capire il motivo per cui dell'evento non viene licenziato.

Questa è l'implementazione della mia classe:

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);

prestare attenzione a:

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

Questo codice viene attivato correttamente e restituisce il tipo di evento previsto tramite un avviso. Ma prima che l'allarme si prevede di attivare un evento personalizzato su se stessa. Questo è dove sto incontrando il mio problema.

$(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);
}

Si vede qui l'avviso "Hurrah" è quello che voglio fuoco, ma purtroppo sto avendo senza fortuna qui. Ironia della sorte ho fatto la stessa cosa con un'altra classe implementata nello stesso modo invio di un evento personalizzato e l'ascoltatore sta ricevendo proprio bene. Tutte le idee sul perché questo non avrebbe funzionato?

Aggiornamento:

Per discutere nei commenti, sembra che Logging "questo" in consolle restituisce l'oggetto JS che rappresenta la classe. Ma la registrazione "$ (this)" restituisce un oggetto jQuery vuoto, quindi grilletto non sarebbe mai stato licenziato. Dei pensieri su perché $ (questo) è in arrivo vuota quando "questo" è accuratamente tornando l'istanza della classe?

È stato utile?

Soluzione

ho scoperto che jQuery non poteva indice mio scopo perché la classe implementata propria versione si dispone di un metodo di jQuery. In questo caso, la lunghezza (). Rinominare la lunghezza () per totale () risolto il problema completamente e qualsiasi istanza della classe può con successo eventi di trigger.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top