Backbone.js Can';t扩展coffeescript中的backbone.events
我得到了一个错误:Backbone.js Can';t扩展coffeescript中的backbone.events,backbone.js,coffeescript,extends,Backbone.js,Coffeescript,Extends,我得到了一个错误: Uncaught TypeError: Cannot read property 'constructor' of undefined 声明以下类时: class ViewHelpers extends Backbone.Events 我可以使用相同的语法来扩展Backbone.Router、Views、Model等。下面是我在快速日志中编写的编译javascript,以确保Backbone.Events在那里 __t('views').ViewHelpers = (
Uncaught TypeError: Cannot read property 'constructor' of undefined
声明以下类时:
class ViewHelpers extends Backbone.Events
我可以使用相同的语法来扩展Backbone.Router、Views、Model等。下面是我在快速日志中编写的编译javascript,以确保Backbone.Events在那里
__t('views').ViewHelpers = (function(_super) {
#how i know it is definied here
console.log(_super.trigger)
__extends(ViewHelpers, _super);
function ViewHelpers() {
return ViewHelpers.__super__.constructor.apply(this, arguments);
}
return ViewHelpers;
})(Backbone.Events);
因此,导致错误的行是
ViewHelpers.__super__.constructor.apply(this, arguments);
_u_extends()方法对于Backbone.View而不是Backbone.Events有什么不同 这是因为
主干.Events
不是一个“类”,所以不能扩展,它是一个“模块”,可以混合到其他对象中(参见文档)。在JavaScript术语中,这意味着它不是可以作为构造函数调用的函数(即新主干.Events
将抛出错误),它只是一个普通的JS对象,其属性(方法)可以分配给其他对象,使其成为事件分派器
在CoffeeScript中,您可以在创建对象时将主干.Events
混合到对象中:
class ViewHelpers
constructor: ->
_.extend @, Backbone.Events
或者,您可以扩展类的原型,避免将这些方法作为所有ViewHelpers
实例的(自己的)属性:
class ViewHelpers
_.extend @prototype, Backbone.Events
这两种方法应该可以工作,并允许您实例化和使用ViewHelper作为事件分派器:
vh = new ViewHelpers
vh.on 'foo', -> alert 'bar'
vh.trigger 'foo'
还有另一种方法(根据@epidemian的回答),它不涉及将主干.Events
复制到一个新对象中用作原型,而是使用对象.create
创建一个新对象用作原型,使用主干.Events
作为原型
class ViewHelpers
@prototype = Object.create(Backbone.Events)
现在,ViewHelpers
“原型是一个新的空对象,其原型是Backbone.Events
。您可以在ViewHelpers
'原型上定义方法,而不影响主干.Events
,但所有主干.Events
方法仍可用于ViewHelpers
,而无需将它们复制到新对象中。这不仅节省了(很小的)内存,而且如果您后来添加到主干。事件
,所有查看帮助程序
都会看到更改
为此,您需要或。要在@epidemian的优秀答案的基础上进一步完善,我想补充一点,这有点像黑客,但它允许您使用问题中指定的extenses
语句编写类(这允许您在所有主干.Events
方法上调用super
):
使用.extend
调用Events.constructor
函数会很好,但我无法让它工作…\uu(@::).extend Backbone.Events
是\ucode>的替代品。extend@prototype,Backbone.Events
可能读得更好(当然取决于better的本地定义).@muistooshort-Yeap,与之相反的是@:
是,在这种情况下,的可视助手。prototype
(对于任何想知道=D的人)。非常有用的帖子,深入了解了咖啡和主干是如何为如此简短的答案工作的!请注意,ViewHelpers
正在被Backbone.Events
扩展(关闭),因此不要期望能够定义自己的on
、off
或trigger
方法(例如,包装Backbone.Events
的方法,以便通过super
调用它们)我已经在下面的回答中对Backbone.Events和其他主干对象之间的区别进行了评论,但是,我想问:ViewHelper的用途是什么?因为它的名称不是类的典型名称(即单数名词),所以可能一个类不是您所需要的。下面的答案很好,谢谢!我同意助手通常是在全球范围内定义的。在本例中,我在类ViewHelpers中维护一个函数库,该函数库被实例化为主控制器类的属性。有一些函数(例如CSS transitionEnd处理程序),我可能希望订阅多个侦听器,而不是传递单个回调。因为我已经在使用主干网,所以我想我应该将事件“class”(object)子类化。很抱歉,我的回复迟到了,我不知道为什么几个月前没有收到通知。
class Events
_.extend Events.prototype, Backbone.Events
class CustomEvents extends Events
trigger: (event, etc...) ->
# You can add overrides before
super "custom:#{event}", etc...
# or after the super class methods