javascript - 主干事件不适用于 object.function

标签 javascript backbone.js

我正在尝试通过对象委托(delegate)我的事件。但是该事件不会触发,如果我直接引用它(“click .formations div”:this.movement.leaveCell)它将抛出一个JS错误

events: {
    "click .formations div":"enterCell", //option A
    "click .save ":"movement.leaveCell", //option B
    "click .save ":function(ev){this.movement.leaveCell(ev, this);}, //option C currently works
},
enterCell: function(ev){
    $(ev.currentTarget).addClass('highlight');
},
movement: {
    leaveCell: function(ev){
        $(ev.currentTarget).removeClass('highlight');
    }
},

如何让选项 B 发挥作用?

最佳答案

从 Backbone 的源代码中,您可以看到负责事件委托(delegate) delagateEvents 的方法

delegateEvents: function(events) {
      if (!(events || (events = _.result(this, 'events')))) return this;
      this.undelegateEvents();
      for (var key in events) {
        var method = events[key];
        if (!_.isFunction(method)) method = this[events[key]];
        if (!method) continue;

        var match = key.match(delegateEventSplitter);
        var eventName = match[1], selector = match[2];
        method = _.bind(method, this);
        eventName += '.delegateEvents' + this.cid;
        if (selector === '') {
          this.$el.on(eventName, method);
        } else {
          this.$el.on(eventName, selector, method);
        }
      }
      return this;
    },

从这里您可以看到 delegateEvents() 的 native 实现不会处理您的情况。它将尝试搜索不正确的 movement.leaveCell

如果你想强制 Backbone.View 按照你的方式去做,你应该重写这个方法。

<小时/>

更新

Here是一个简单的工作 fiddle ,带有重写的 delegateEvents 方法。

Backbone.View.prototype.delegateEvents = function(events) {
      if (!(events || (events = _.result(this, 'events')))) return this;
      this.undelegateEvents();
      for (var key in events) {
        var method = events[key];
          if (!_.isFunction(method)) {
          var behaviors = method.split('.');
              if(behaviors.length > 1) {
                  method = this[behaviors[0]][behaviors[1]];
              } else {
                  method = this[events[key]];
              }

          }
        if (!method) continue;

        var match = key.match(/^(\S+)\s*(.*)$/);
        var eventName = match[1], selector = match[2];
        method = _.bind(method, this);
        eventName += '.delegateEvents' + this.cid;
        if (selector === '') {
          this.$el.on(eventName, method);
        } else {
          this.$el.on(eventName, selector, method);
        }
      }
      return this;
    };

此示例适用于一层深度的对象,但不再适用。

我会推荐你​​看看Marionette.jsMarionette.Behaviors ,它也旨在分离 View 及其行为。

关于javascript - 主干事件不适用于 object.function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27041234/

相关文章:

backbone.js - 带状态的 Backbone 路由

javascript - Socket.io 从一个事件发出多条消息

javascript - 网络共享 api 级别 2 PDF 支持

javascript - m 自定义Scrollbar自动滚动问题

backbone.js - 动态分配backbone.js View el的正确方法

javascript - Backbone js : Only render when specific attributes have changed?

javascript - jQuery 动画宽度元素溢出

javascript - 为什么不能像 html/javascript 中的 document.body.div[0] 一样访问 body 的第一个 div 元素

ruby - 我正在尝试使用 yeoman 和backbone 创建示例应用程序,但显示一些错误有人可以帮助我吗?

javascript - url 中没有哈希值的回家路线...backbone.js?