我的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都很好(渲染函数,构造函数方法等)
我的语法不正确吗?为什么这不让我混合事件?
答案 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);
现在您可以看到@mixin
(V.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
并进行合并。