J'avais besoin de la capacité de l'emporter et d'appeler mixte dans les méthodes (ala super) de plus près à la façon dont ruby poignées de modules. Et la simple extension de la méthode tabasser le mixin méthode si elle était dans la classe. Depuis que je suis en train de construire tout en CoffeeScript, j'ai accès à la super objet qui me permet de cale méthodes. Il permettra également de fusionner automatiquement les événements de l'objet de sorte que vous pouvez définir des gestionnaires d'événements dans le mixin.
_.extend Backbone,
mixin: (klass, mixin, merge) ->
debugger unless mixin
mixin = mixin.prototype || mixin
merge ||= ["events"]
sup = _.extend({},klass.__super__)
for name,func of mixin
if base = sup[name] && _.isFunction(base)
sup[name] = ->
func.apply this, arguments
base.apply this, arguments
else
sup[name] = func
hp = {}.hasOwnProperty
prototype = klass.prototype
for name,func of mixin
continue unless hp.call(mixin,name)
continue if _(merge).contains name
prototype[name] = func unless prototype[name]
klass.__super__ = sup
_(merge).each (name) ->
if mixin[name]
prototype[name] = _.extend({},mixin.events,prototype.events)
@
L'utilisation de la
class SimpleView extends Backbone.View
events:
"click .show" : "show"
calculate: ->
super + 5
show: ->
console.log @calculate()
class CalculatableViewMixin
events:
"click .calculate" : "show"
calculate: ->
15
Backbone.mixin SimpleView, CalculatableViewMixin