From bdf795dd8a80f35f2be0a2a19997ec7adf4c4223 Mon Sep 17 00:00:00 2001 From: Sam Saccone Date: Sun, 21 Sep 2014 15:39:46 -0400 Subject: [PATCH] Add auto addRegions behavior to regionMananger fixes #1902 --- api/region-manager.jsdoc | 37 ++++++++++++++++---------------- docs/marionette.regionmanager.md | 15 +++++++++++++ src/region-manager.js | 3 +++ test/unit/region-manager.spec.js | 28 ++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 18 deletions(-) diff --git a/api/region-manager.jsdoc b/api/region-manager.jsdoc index 95fef90c08..4090719c73 100644 --- a/api/region-manager.jsdoc +++ b/api/region-manager.jsdoc @@ -10,23 +10,24 @@ description: | Even if you're not using this class redirectly, it is already being used by Marionette.Application and Marionette.LayoutView. -constructor: | - RegionManagers can be instantiated directly and can have regions added and removed via several methods. - - ```js - var rm = new Marionette.RegionManager(); - - var region = rm.addRegion("foo", "#bar"); - - var regions = rm.addRegions({ - baz: "#baz", - quux: "ul.quux" - }); - - regions.baz.show(myView); - - rm.removeRegion("foo"); - ``` +constructor: + description: | + RegionManagers can be instantiated directly and can optionally have default regions passed into the constructor. + + examples: + - + name: Creating a RegionMananger with default regions + example: | + + ```js + var mananger = new Marionette.RegionManager({ + regions: { + "aRegion": "#bar" + } + }) + + mananger.getRegion('aRegion').show(new MyView); + ``` functions: addRegion: @@ -361,4 +362,4 @@ interators: | - last - without - isEmpty - - pluck \ No newline at end of file + - pluck diff --git a/docs/marionette.regionmanager.md b/docs/marionette.regionmanager.md index 9b6b718388..d2b4c0a5d8 100644 --- a/docs/marionette.regionmanager.md +++ b/docs/marionette.regionmanager.md @@ -14,6 +14,7 @@ objects. ## Documentation Index * [Basic Use](#basic-use) +* [Constucting](#constructing) * [RegionManager.addRegion](#regionmanageraddregion) * [RegionManager.addRegions](#regionmanageraddregions) * [addRegions default options](#addregions-default-options) @@ -50,6 +51,20 @@ regions.baz.show(myView); rm.removeRegion("foo"); ``` +## Constructing + +The RegionMananger take an optional `region` option in their constructor. the regions are passed directly into `addRegions` for the region mananger instance. + +```js +var mananger = new Marionette.RegionManager({ + regions: { + "aRegion": "#bar" + } +}); + +mananger.getRegion('aRegion').show(new MyView); +``` + ## RegionManager.addRegion Regions can be added individually using the `addRegion` diff --git a/src/region-manager.js b/src/region-manager.js index 04d3ef6ea0..3013d3e984 100644 --- a/src/region-manager.js +++ b/src/region-manager.js @@ -7,7 +7,10 @@ Marionette.RegionManager = (function(Marionette) { var RegionManager = Marionette.Controller.extend({ constructor: function(options) { this._regions = {}; + Marionette.Controller.call(this, options); + + this.addRegions(this.getOption('regions')); }, // Add multiple regions using an object literal or a diff --git a/test/unit/region-manager.spec.js b/test/unit/region-manager.spec.js index 4d96cde475..62798cf559 100644 --- a/test/unit/region-manager.spec.js +++ b/test/unit/region-manager.spec.js @@ -1,6 +1,34 @@ describe('regionManager', function() { 'use strict'; + describe('instantiating a regionManager', function() { + beforeEach(function() { + this.context = $('
'); + this.parentElHandler = this.sinon.stub().returns(this.context); + + this.regions = { + "aRegion": "#thor", + "bRegion": "#eos" + }; + + this.addRegionSpy = this.sinon.stub(); + + this.RegionManager = Marionette.RegionManager.extend({ + addRegions: this.addRegionSpy + }); + + this.regionManager = new this.RegionManager({ + regions: this.regions + }); + }); + + it('should pass regions to addRegions', function() { + expect(this.addRegionSpy).to.have + .been.calledWith(this.regions) + .and.to.have.been.calledOn(this.regionManager); + }); + }); + describe('.addRegion', function() { describe('with a name and selector', function() { beforeEach(function() {