Chaplin.Composer

Why we need it

  • Backbone apps leaked memory hardcore
  • Backbone + Chaplin aggressively garbage collects
  • A facility was needed to allow object persistence

What it does

Grants the ability for views (and related data) to be persisted beyond one controller action.

Regular Controller Action

module.exports = class ServiceController extends Controller
  index: ->
    @collection = new Services
    @view = new ServiceCollectionView {@collection, region: 'main'}
    @collection.fetch().then @view.render

Composed Controller Action

module.exports = class Controller extends Chaplin.Controller
  # Compositions persist stuff between controllers.
  # You may also persist models etc.
  beforeAction: ->
    @reuse 'site', SiteView
    @reuse 'header', HeaderView, {region: 'header'}
    @reuse 'footer', FooterView, {region: 'footer'}

Demo persisted views

Advanced compositions

@reuse 'itemRecommendations',
  compose: ->
    @item = new ItemRecommendations [],
      context: {type: 'Product', scenario: 'Variant Detail'}
    data = {ids: [params.variantId]}
    if isBrowsing
      getRecommendationsCallback @item, data
    else
      unless member.isSynced()
        @listenToOnce member, 'sync', =>
          getRecommendationsCallback @item, _.extend data,
            member_id: member.id
          , options.query
      else
        getRecommendationsCallback @item, _.extend data,
          member_id: member.id
        , options.query

Resources

Chaplin.Composer

By Josh Habdas

Chaplin.Composer

  • 3,122