Javascript jQuery:为什么触发器不会从JS对象触发?

Javascript jQuery:为什么触发器不会从JS对象触发?,javascript,jquery,coffeescript,dom-events,Javascript,Jquery,Coffeescript,Dom Events,我一直在jQuery中实现发布者/订阅者设计模式的一种形式。我基本上是利用CoffeeScript在Javascript中构建类,CoffeeScript在我的页面上充当组件。i、 e.导航、数据列表等 我没有让DOM元素触发事件,而是让这些类的实例使用触发器发送自定义事件。然后,这些实例可以相互侦听,并根据彼此行为的变化相应地更新它们拥有的DOM元素 我知道这是可行的,因为我有一个组件可以正确地调度自定义事件。然而,我遇到了一个障碍。我已经创建了另一个组件,就我的一生而言,我无法理解为什么它的

我一直在jQuery中实现发布者/订阅者设计模式的一种形式。我基本上是利用CoffeeScript在Javascript中构建类,CoffeeScript在我的页面上充当组件。i、 e.导航、数据列表等

我没有让DOM元素触发事件,而是让这些类的实例使用触发器发送自定义事件。然后,这些实例可以相互侦听,并根据彼此行为的变化相应地更新它们拥有的DOM元素

我知道这是可行的,因为我有一个组件可以正确地调度自定义事件。然而,我遇到了一个障碍。我已经创建了另一个组件,就我的一生而言,我无法理解为什么它的事件没有被触发

这是我的类的实现:

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);
此代码被正确触发,并通过警报返回预期的事件类型。但在发出警报之前,它预计会触发自身的自定义事件。这就是我遇到问题的地方

$(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);
}
你看,这里的警报“万岁”是我想发射的,但不幸的是,我在这里没有运气。具有讽刺意味的是,我对另一个类做了完全相同的事情,该类以相同的方式实现,发送一个自定义事件,而监听器接收到它就很好。你知道为什么这行不通吗

更新:
根据注释中的讨论,在控制台中记录“this”似乎会返回表示类的JS对象。但记录“$(this)”会返回一个空的jQuery对象,因此永远不会触发触发器。当“this”准确地返回类的实例时,有没有想过为什么$(this)会变成空的?

我发现jQuery无法索引我的对象,因为类实现了它自己版本的jQuery方法。在本例中,使用length()。将length()方法重命名为total()完全解决了问题,该类的任何实例都可以成功触发事件。

请使用
var
声明局部变量!!!!!!!这是来自CoffeeScript的生成器。这是个好机会。我不知道为什么在某些情况下不是这样。它通常在任何地方都这样做。几周前,我最近升级到了新版本的编译器。可能这个问题已经解决了。哦,很抱歉,我没有粘贴到整个文档中。ready()我看到“List”代码已经适当地
var
,但是“ready”处理程序没有。如果您设置了其中两个,并且每个都使用相同的变量名,那么这将是一个问题。所有变量都位于ready函数的第一行。Coffee会自动确定变量的范围,这样就不会有问题了。我只是忘了在函数的第一行复制。很有趣,也很有看点。让我想起了IE的经典缺点:给一个按钮ID“提交”
$(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);
}