Skip to content

Instantly share code, notes, and snippets.

@yocontra
Last active December 12, 2015 12:39
Show Gist options
  • Save yocontra/4773445 to your computer and use it in GitHub Desktop.
Save yocontra/4773445 to your computer and use it in GitHub Desktop.
Backbone layout manager
FooterV = SomeViewInstance;
MainV = SomeViewInstace;
MyLayout = Backbone.Layout.extend({
template: function(){
// this can be any js function that returns html or a jquery el
return "<div id='sidebar'/><div id='main'/><div id='footer'/>";
},
// Define friendly names for regions
regions: {
"sidebar": "#sidebar",
"content": "#content",
"footer": "#footer"
},
// Define any default region views
views: {
"footer": FooterV
}
});
sickLayout = new MyLayout
$("body").html(sickLayout.render().el)
// show will call clear on any views already in the region
// then put view.render().el in it
sickLayout.set("content", MainV).show("content")
// clear will call close on the view and empty the region
sickLayout.clear("content")
// get will get the view currently in a region
sickLayout.get("content").doSomething()
define ->
# extend backbone
class Backbone.Layout extends Backbone.View
$regions: {}
_regions: {}
render: ->
@$el.empty()
if @template?
@$el.append @template arguments...
@$set name, select for own name, select of @regions
if @views?
@set name, v for own name, v of @views
@trigger "render", @
return @
$set: (name, selector) => @$regions[name] = @$ selector
$get: (name) => @$regions[name]
get: (name) => @_regions[name]
set: (name, nu) =>
throw new Error "Invalid region" unless @$regions[name]
@clear name
@_regions[name] = nu
@trigger "change:#{name}", nu
@trigger "change", name, nu
return @
show: (name, a...) =>
throw new Error "Invalid region" unless @$regions[name]
throw new Error "Region not set to a view" unless @_regions[name]
vu = @_regions[name]
vu.setElement vu.el
@$regions[name].html vu.render(a...).el
@trigger "show:#{name}"
@trigger "show", name
return @
clear: (name) =>
@_regions[name]?.close?()
@$regions[name]?.empty()
@trigger "clear:#{name}"
@trigger "clear", name
return @
_.extend Backbone.Layout
return Backbone
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment