出于某种原因,我的Backbone Cocktail.js mixin事件被覆盖了

时间:2013-08-15 20:37:40

标签: jquery backbone.js coffeescript mixins cocktail.js

我的mixin

window.MyMixins = {}

MyMixins.GlobalViewMethods =

  events:
    'click #skipit' : 'skipit'

我的观点

Maestra.Views.Questions ||= {}

class Maestra.Views.Questions.Prereq extends Backbone.View
  @mixin MyMixins.GlobalViewMethods

  template: JST["backbone/templates/questions/prereq"]

  events:
    "click #stepone"                        : "open_stepone"
    "click #steptwo"                        : "open_steptwo"
    "click #stepthree"                      : "open_stepthree"
    "click #stepone, #steptwo, #stepthree"  : "add_complete"    
    "click #iamstupidready"                 : "check_question"  

当我运行它时,我的mixin事件不起作用。但是,如果我从View中删除了所有事件,那么mixin事件就可以了。否则,所有其他事件都有效,View的事件总是覆盖Mixin的事件。其他所有klobbers都很好(渲染函数,构造函数方法等)

我的语法不正确吗?为什么这不让我混合事件?

1 个答案:

答案 0 :(得分:3)

问题是当@mixin运行时:

@mixin MyMixins.GlobalViewMethods

类中没有events因此没有合并。然后,您点击了events

events:
  "click #stepone"                        : "open_stepone"
  #...

并且CoffeeScript将覆盖events添加的@mixin(请记住@mixin知道合并,而CoffeeScript则不知道。如果我们看一个简化的例子,你应该看看发生了什么;这个CoffeeScript:

class V extends Backbone.View
  @mixin MyMixins.GlobalViewMethods
  events:
    "click #in_v" : "in_v"      

成为这个JavaScript(删除了一堆嘈杂的样板):

V = (function(_super) {
  //...
  function V() {
    _ref = V.__super__.constructor.apply(this, arguments);
    return _ref;
  }

  V.mixin(MyMixins.GlobalViewMethods);

  V.prototype.events = {
    "click #in_v": "in_v"
  };

  return V;

})(Backbone.View);

现在您可以看到@mixinV.mixin)运行并将一些events合并到不存在的V.prototype.events中,然后V.prototype.events被覆盖来自events的{​​{1}}。

您如何解决订购问题?好吧,您只需将V来电置于底部即可调整订单:

@mixin

现在class V extends Backbone.View events: "click #in_v" : "in_v" @mixin MyMixins.GlobalViewMethods 会在@mixin中看到events并进行合并。

演示:http://jsfiddle.net/ambiguous/2f9hV/1/