Last Updated: February 25, 2016
·
2.447K
· jaysoo

CoffeeScript mixins in Backbone

This will allow you to use mixins in your Backbone models, views, collections, and routers.

include = (mixins...) ->
    throw new Error('include(mixins...) requires at least one mixin') unless mixins and mixins.length > 0

    for mixin in mixins
      for key, value of mixin
        @::[key] = value unless key is 'included'

      mixin.included?.apply(this)
    this

Backbone.Model.include = Backbone.Collection.include = include
Backbone.View.include = Backbone.Router.include = include

Then you can do:

Foo =
  # Executes when included
  included: ->
    @message = 'Hello World!'

  # This method will be mixed in
  bar: -> console.log @message

class MyView extends Backbone.View
  @include Foo

view = new MyView
view.bar()  # prints 'Hello World!

1 Response
Add your response

Thanks for this. The only issue I ran into was trying to use super in the instance methods since Coffeescript will error due to detecting super being called outside of an instance method when it parses the mixin code.

I got around this by manually finding/calling the super method:

@Foo =
  bar: () ->
    # Do something...
    # Falling back to super if found
    if superMethod = @constructor.__super__[arguments.callee.name]
      superMethod.apply @, arguments

If you know of a better way, please let me know!

Erik

over 1 year ago ·