Regions provide consistent methods to manage, show and destroy views in your applications and layouts. You can use a jQuery selector to identify where your region must be displayed.
See the documentation for View for an introduction in managing regions throughout your application.
reset
A RegionThe Application defines a single region el
using the region
attribute. This
can be accessed through getRegion()
or have a view displayed directly with
showView()
. Below is a short example:
var Mn = require('backbone.marionette');
var SomeView = require('./view');
var App = Mn.Application.extend({
region: '#main-content',
onStart: function() {
var main = this.getRegion(); // Has all the properties of a `Region`
main.show(new SomeView());
}
});
For more information, see the Application docs.
Marionette supports multiple ways to define regions on your Application
or
View
. This section will document the different types as applied to View
,
although they will work for Application
as well - just replace regions
with
region
in your definition.
You can use a jQuery string selector to define regions.
var Mn = require('backbone.marionette');
var MyView = Mn.View.extend({
regions: {
mainRegion: '#main'
}
});
You can define regions with an object literal. Object literal definitions expect
an el
property - the jQuery selector string to hook the region into. The
object literal is the most common way to define whether showing the region
overwrites the el
or just overwrites the content (the default behavior).
To overwrite the parent el
of the region with the rendered contents of the
inner View, use replaceElement
as so:
var Mn = require('backbone.marionette');
var OverWriteView = Mn.View.extend({
className: '.new-class'
});
var MyView = Mn.View.extend({
regions: {
main: {
el: '.overwrite-me',
replaceElement: true
}
}
});
var view = new MyView();
view.render();
console.log(view.$('.overwrite-me').length); // 1
console.log(view.$('.new-class').length); // 0
view.showChildView('main', new OverWriteView());
console.log(view.$('.overwrite-me').length); // 0
console.log(view.$('.new-class').length); // 1
When the instance of MyView
is rendered, the .overwrite-me
element will be
removed from the DOM and replaced with an element of .new-class
- this lets
us do things like rendering views inside table
or select
more easily -
these elements are usually very strict on what content they will allow.
The regions
attribute on a view can be a
function returning an object:
var Mn = require('backbone.marionette');
var MyView = Mn.View.extend({
regions: function(options){
return {
firstRegion: '#first-region'
};
}
});
The options
argument contains the options passed to the view on instantiation.
As the view has not been constructed yet, this.getOption()
is not able to
return any options from the view - use options
instead.
To add regions to a view after it has been instantiated, simply use the
addRegion
method:
var MyView = require('./myview');
myView = new MyView();
myView.addRegion('thirdRegion', '#third-region');
Now we can access thirdRegion
as we would the others.
Once a region is defined, you can call its show
and empty
methods to display and shut-down a view:
var myView = new MyView();
var childView = new MyChildView();
var mainRegion = myView.getRegion('main');
// render and display the view
mainRegion.show(childView);
This is equivalent to a view's showChildView
which can be used as:
var myView = new MyView();
var childView = new MyChildView();
// render and display the view
myView.showChildView('main', childView);
Both forms take an options
object that will be passed to the
events fired during show
.
For more information on showChildView
and getChildView
, see the
Documentation for Views
You can remove a view from a region (effectively "unshowing" it) with
region.empty()
on a region:
var myView = new MyView();
myView.showChildView('main', new OtherView());
var mainRegion = myView.getRegion('main');
mainRegion.empty();
This will destroy the view, cleaning up any event handlers and remove it from the DOM.
If you replace the current view with a new view by calling show
,
by default it will automatically destroy the previous view.
You can prevent this behavior by passing {preventDestroy: true}
in the options
parameter. Several events will also be triggered on the views.
// Show the first view.
var myView = new MyView();
var childView = new MyChildView();
var mainRegion = myView.getRegion('main');
mainRegion.show(childView);
// Replace the view with another. The
// `destroy` method is called for you
var anotherView = new AnotherView();
mainRegion.show(anotherView);
// Replace the view with another.
// Prevent `destroy` from being called
var anotherView2 = new AnotherView();
mainRegion.show(anotherView2, {preventDestroy: true});
mainRegion.empty({preventDestroy: true});
NOTE When using preventDestroy: true
you must be careful to cleanup your
old views manually to prevent memory leaks.
If you wish to check whether a region has a view, you can use the hasView
function. This will return a boolean value depending whether or not the region
is showing a view.
var myView = new MyView();
var mainRegion = myView.getRegion('main');
mainRegion.hasView() // false
mainRegion.show(new OtherView());
mainRegion.hasView() // true
reset
A RegionA region can be reset
at any time. This destroys any existing view
being displayed, and deletes the cached el
. The next time the
region shows a view, the region's el
is queried from
the DOM.
var myView = new MyView();
myView.showChildView('main', new OtherView());
var mainRegion = myView.getRegion('main');
myRegion.reset();
This can be useful in unit testing your views.
el
Is AttachedOverride the region's attachHtml
method to change how the view is attached
to the DOM. This method receives one parameter - the view to show.
The default implementation of attachHtml
is:
var Mn = require('backbone.marionette');
Mn.Region.prototype.attachHtml = function(view){
this.$el.empty().append(view.el);
}
This replaces the contents of the region with the view's
el
/ content. You can override attachHtml
for transition effects and more.
var Mn = require('backbone.marionette');
Mn.Region.prototype.attachHtml = function(view){
this.$el.hide();
this.$el.html(view.el);
this.$el.slideDown("fast");
}
It is also possible to define a custom render method for a single region by extending from the Region class and including a custom attachHtml method.
This example will make a view slide down from the top of the screen instead of just appearing in place:
var Mn = require('backbone.marionette');
var ModalRegion = Mn.Region.extend({
attachHtml: function(view){
// Some effect to show the view:
this.$el.empty().append(view.el);
this.$el.hide().slideDown('fast');
}
});
var MyView = Mn.View.extend({
regions: {
mainRegion: '#main-region',
modalRegion: {
regionClass: ModalRegion,
el: '#modal-region'
}
}
});