2

我的混音

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 事件不起作用。但是,如果我从视图中删除所有事件,那么 mixin 事件就会起作用。否则,所有其他事件都会起作用,并且 View 的事件总是会覆盖 Mixin 的事件。其他一切都很好(渲染函数、构造函数等)

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

4

1 回答 1

3

问题是当@mixin运行时:

@mixin MyMixins.GlobalViewMethods

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

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

CoffeeScript 将覆盖添加的events内容@mixin(请记住,@mixin知道合并,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);

现在您可以看到@mixin( V.mixin) 运行并将一些合并events到不存在的中V.prototype.events,然后被fromV.prototype.events覆盖。eventsV

如何解决订购问题?好吧,您只需将@mixin调用放在底部即可调整顺序:

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

现在@mixin将看到并events进行V一些合并。

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

于 2013-08-15T21:14:19.527 回答