我想用 CoffeeScript 类而不是函数来定义 flightjs 组件,但这似乎是不可能的,因为 flight 忽略了对象的原型。我不能写:
define ['flight/component'], (defineComponent) ->
class MyDropdown
constructor: () ->
@defaultAttrs #attrs
@after 'initialize', () ->
#doSmth
func1: (evt, data) ->
func2: (evt, data) ->
return defineComponent MyDropdown
代替
define ['flight/component'], (defineComponent) ->
return DefineComponent () ->
this.func1 = (evt, data) ->
this.func2 = (evt, data) ->
this.defaultAttrs #attrs
this.after 'initialize', () ->
#doSmth
因为第一个代码示例将 func1 和 func2 绑定到 MyDropdown 原型
MyDropdown.ptototype.func1
所以我发现的唯一解决方法是在构造函数已经是飞行组件时创建“代理”类来绑定原型方法:
define [], () ->
class FlightComponent
constructor: (childClass) ->
# constructor is ommited because I don't want to override component's constructor
@[name] = func if name isnt 'constructor' for name, func of childClass.prototype
return FlightComponent
define ['flight/component', 'js/FlightComponent'], (defineComponent, FlightComponent) ->
class MyDropdown extends FlightComponent
constructor: () ->
super MyDropdown
@defaultAttrs #attrs
@after 'initialize', () ->
#doSmth
func1: (evt, data) ->
func2: (evt, data) ->
return defineComponent MyDropdown
我认为我必须使用类作为参数调用父构造函数才能使其与飞行 API 一起使用,这很尴尬。我可以克服父类,只是在构造函数的开头编写代码,但我发现继承更灵活(如果我将来添加 DataComponent 和 Component 类)。
所以我想知道有没有更好的方法来将 CoffeeScript 的完整期货与 Twitter Flight 结合使用?
飞行不允许将方法绑定到对象原型似乎是违反直觉的......或者我错过了什么?
编辑
我现在发现的最佳解决方案:
define ['flight/component', 'js/mixin1', 'js/mixin2'], (defineComponent, withA, withB) ->
class MyDropdown extends defineComponent withA, withB
constructor: ->
# yay, got access to mixins, component and MyDropdown's prototype methods