marionette-rails 1.0.0.rc1 → 1.0.0.rc2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,17 +1,21 @@
1
- /*!
2
- * Backbone.Marionette, v1.0.0-rc1
3
- * Copyright (c)2012 Derick Bailey, Muted Solutions, LLC.
4
- * Distributed under MIT license
5
- * http://github.com/marionettejs/backbone.marionette
6
- */
1
+ // Backbone.Marionette, v1.0.0-rc2
2
+ // Copyright (c)2012 Derick Bailey, Muted Solutions, LLC.
3
+ // Distributed under MIT license
4
+ // http://github.com/marionettejs/backbone.marionette
5
+
6
+
7
7
  /*!
8
8
  * Includes BabySitter
9
9
  * https://github.com/marionettejs/backbone.babysitter/
10
+ *
10
11
  * Includes Wreqr
11
12
  * https://github.com/marionettejs/backbone.wreqr/
13
+ *
12
14
  * Includes EventBinder
13
15
  * https://github.com/marionettejs/backbone.eventbinder/
14
16
  */
17
+
18
+
15
19
  // Backbone.BabySitter, v0.0.4
16
20
  // Copyright (c)2012 Derick Bailey, Muted Solutions, LLC.
17
21
  // Distributed under MIT license
@@ -572,6 +576,48 @@ Marionette.triggerMethod = function(){
572
576
  }
573
577
  };
574
578
 
579
+ // DOMRefresh
580
+ // ----------
581
+ //
582
+ // Monitor a view's state, and after it has been rendered and shown
583
+ // in the DOM, trigger a "dom:refresh" event every time it is
584
+ // re-rendered.
585
+
586
+ Marionette.MonitorDOMRefresh = (function(){
587
+ // track when the view has been rendered
588
+ function handleShow(view){
589
+ view._isShown = true;
590
+ triggerDOMRefresh(view);
591
+ }
592
+
593
+ // track when the view has been shown in the DOM,
594
+ // using a Marionette.Region (or by other means of triggering "show")
595
+ function handleRender(view){
596
+ view._isRendered = true;
597
+ triggerDOMRefresh(view);
598
+ }
599
+
600
+ // Trigger the "dom:refresh" event and corresponding "onDomRefresh" method
601
+ function triggerDOMRefresh(view){
602
+ if (view._isShown && view._isRendered){
603
+ if (_.isFunction(view.triggerMethod)){
604
+ view.triggerMethod("dom:refresh");
605
+ }
606
+ }
607
+ }
608
+
609
+ // Export public API
610
+ return function(view){
611
+ view.bindTo(view, "show", function(){
612
+ handleShow(view);
613
+ });
614
+
615
+ view.bindTo(view, "render", function(){
616
+ handleRender(view);
617
+ });
618
+ };
619
+ })();
620
+
575
621
 
576
622
  // EventBinder
577
623
  // -----------
@@ -722,125 +768,6 @@ _.extend(Marionette.Callbacks.prototype, {
722
768
  });
723
769
 
724
770
 
725
- // Template Cache
726
- // --------------
727
-
728
- // Manage templates stored in `<script>` blocks,
729
- // caching them for faster access.
730
- Marionette.TemplateCache = function(templateId){
731
- this.templateId = templateId;
732
- };
733
-
734
- // TemplateCache object-level methods. Manage the template
735
- // caches from these method calls instead of creating
736
- // your own TemplateCache instances
737
- _.extend(Marionette.TemplateCache, {
738
- templateCaches: {},
739
-
740
- // Get the specified template by id. Either
741
- // retrieves the cached version, or loads it
742
- // from the DOM.
743
- get: function(templateId){
744
- var that = this;
745
- var cachedTemplate = this.templateCaches[templateId];
746
-
747
- if (!cachedTemplate){
748
- cachedTemplate = new Marionette.TemplateCache(templateId);
749
- this.templateCaches[templateId] = cachedTemplate;
750
- }
751
-
752
- return cachedTemplate.load();
753
- },
754
-
755
- // Clear templates from the cache. If no arguments
756
- // are specified, clears all templates:
757
- // `clear()`
758
- //
759
- // If arguments are specified, clears each of the
760
- // specified templates from the cache:
761
- // `clear("#t1", "#t2", "...")`
762
- clear: function(){
763
- var i;
764
- var args = Array.prototype.slice.apply(arguments);
765
- var length = args.length;
766
-
767
- if (length > 0){
768
- for(i=0; i<length; i++){
769
- delete this.templateCaches[args[i]];
770
- }
771
- } else {
772
- this.templateCaches = {};
773
- }
774
- }
775
- });
776
-
777
- // TemplateCache instance methods, allowing each
778
- // template cache object to manage it's own state
779
- // and know whether or not it has been loaded
780
- _.extend(Marionette.TemplateCache.prototype, {
781
-
782
- // Internal method to load the template asynchronously.
783
- load: function(){
784
- var that = this;
785
-
786
- // Guard clause to prevent loading this template more than once
787
- if (this.compiledTemplate){
788
- return this.compiledTemplate;
789
- }
790
-
791
- // Load the template and compile it
792
- var template = this.loadTemplate(this.templateId);
793
- this.compiledTemplate = this.compileTemplate(template);
794
-
795
- return this.compiledTemplate;
796
- },
797
-
798
- // Load a template from the DOM, by default. Override
799
- // this method to provide your own template retrieval,
800
- // such as asynchronous loading from a server.
801
- loadTemplate: function(templateId){
802
- var template = $(templateId).html();
803
-
804
- if (!template || template.length === 0){
805
- var msg = "Could not find template: '" + templateId + "'";
806
- var err = new Error(msg);
807
- err.name = "NoTemplateError";
808
- throw err;
809
- }
810
-
811
- return template;
812
- },
813
-
814
- // Pre-compile the template before caching it. Override
815
- // this method if you do not need to pre-compile a template
816
- // (JST / RequireJS for example) or if you want to change
817
- // the template engine used (Handebars, etc).
818
- compileTemplate: function(rawTemplate){
819
- return _.template(rawTemplate);
820
- }
821
- });
822
-
823
-
824
- // Renderer
825
- // --------
826
-
827
- // Render a template with data by passing in the template
828
- // selector and the data to render.
829
- Marionette.Renderer = {
830
-
831
- // Render a template with data. The `template` parameter is
832
- // passed to the `TemplateCache` object to retrieve the
833
- // template function. Override this method to provide your own
834
- // custom rendering and template handling for all of Marionette.
835
- render: function(template, data){
836
- var templateFunc = typeof template === 'function' ? template : Marionette.TemplateCache.get(template);
837
- var html = templateFunc(data);
838
- return html;
839
- }
840
- };
841
-
842
-
843
-
844
771
  // Marionette Controller
845
772
  // ---------------------
846
773
  //
@@ -1040,6 +967,125 @@ _.extend(Marionette.Region.prototype, Backbone.Events, {
1040
967
  Marionette.Region.extend = Marionette.extend;
1041
968
 
1042
969
 
970
+ // Template Cache
971
+ // --------------
972
+
973
+ // Manage templates stored in `<script>` blocks,
974
+ // caching them for faster access.
975
+ Marionette.TemplateCache = function(templateId){
976
+ this.templateId = templateId;
977
+ };
978
+
979
+ // TemplateCache object-level methods. Manage the template
980
+ // caches from these method calls instead of creating
981
+ // your own TemplateCache instances
982
+ _.extend(Marionette.TemplateCache, {
983
+ templateCaches: {},
984
+
985
+ // Get the specified template by id. Either
986
+ // retrieves the cached version, or loads it
987
+ // from the DOM.
988
+ get: function(templateId){
989
+ var that = this;
990
+ var cachedTemplate = this.templateCaches[templateId];
991
+
992
+ if (!cachedTemplate){
993
+ cachedTemplate = new Marionette.TemplateCache(templateId);
994
+ this.templateCaches[templateId] = cachedTemplate;
995
+ }
996
+
997
+ return cachedTemplate.load();
998
+ },
999
+
1000
+ // Clear templates from the cache. If no arguments
1001
+ // are specified, clears all templates:
1002
+ // `clear()`
1003
+ //
1004
+ // If arguments are specified, clears each of the
1005
+ // specified templates from the cache:
1006
+ // `clear("#t1", "#t2", "...")`
1007
+ clear: function(){
1008
+ var i;
1009
+ var args = Array.prototype.slice.apply(arguments);
1010
+ var length = args.length;
1011
+
1012
+ if (length > 0){
1013
+ for(i=0; i<length; i++){
1014
+ delete this.templateCaches[args[i]];
1015
+ }
1016
+ } else {
1017
+ this.templateCaches = {};
1018
+ }
1019
+ }
1020
+ });
1021
+
1022
+ // TemplateCache instance methods, allowing each
1023
+ // template cache object to manage it's own state
1024
+ // and know whether or not it has been loaded
1025
+ _.extend(Marionette.TemplateCache.prototype, {
1026
+
1027
+ // Internal method to load the template asynchronously.
1028
+ load: function(){
1029
+ var that = this;
1030
+
1031
+ // Guard clause to prevent loading this template more than once
1032
+ if (this.compiledTemplate){
1033
+ return this.compiledTemplate;
1034
+ }
1035
+
1036
+ // Load the template and compile it
1037
+ var template = this.loadTemplate(this.templateId);
1038
+ this.compiledTemplate = this.compileTemplate(template);
1039
+
1040
+ return this.compiledTemplate;
1041
+ },
1042
+
1043
+ // Load a template from the DOM, by default. Override
1044
+ // this method to provide your own template retrieval,
1045
+ // such as asynchronous loading from a server.
1046
+ loadTemplate: function(templateId){
1047
+ var template = $(templateId).html();
1048
+
1049
+ if (!template || template.length === 0){
1050
+ var msg = "Could not find template: '" + templateId + "'";
1051
+ var err = new Error(msg);
1052
+ err.name = "NoTemplateError";
1053
+ throw err;
1054
+ }
1055
+
1056
+ return template;
1057
+ },
1058
+
1059
+ // Pre-compile the template before caching it. Override
1060
+ // this method if you do not need to pre-compile a template
1061
+ // (JST / RequireJS for example) or if you want to change
1062
+ // the template engine used (Handebars, etc).
1063
+ compileTemplate: function(rawTemplate){
1064
+ return _.template(rawTemplate);
1065
+ }
1066
+ });
1067
+
1068
+
1069
+ // Renderer
1070
+ // --------
1071
+
1072
+ // Render a template with data by passing in the template
1073
+ // selector and the data to render.
1074
+ Marionette.Renderer = {
1075
+
1076
+ // Render a template with data. The `template` parameter is
1077
+ // passed to the `TemplateCache` object to retrieve the
1078
+ // template function. Override this method to provide your own
1079
+ // custom rendering and template handling for all of Marionette.
1080
+ render: function(template, data){
1081
+ var templateFunc = typeof template === 'function' ? template : Marionette.TemplateCache.get(template);
1082
+ var html = templateFunc(data);
1083
+ return html;
1084
+ }
1085
+ };
1086
+
1087
+
1088
+
1043
1089
  // Marionette.View
1044
1090
  // ---------------
1045
1091
 
@@ -1056,6 +1102,7 @@ Marionette.View = Backbone.View.extend({
1056
1102
  Marionette.bindEntityEvents(this, this.model, Marionette.getOption(this, "modelEvents"));
1057
1103
  Marionette.bindEntityEvents(this, this.collection, Marionette.getOption(this, "collectionEvents"));
1058
1104
 
1105
+ Marionette.MonitorDOMRefresh(this);
1059
1106
  this.bindTo(this, "show", this.onShowCalled, this);
1060
1107
  },
1061
1108
 
@@ -1134,16 +1181,20 @@ Marionette.View = Backbone.View.extend({
1134
1181
  close: function(){
1135
1182
  if (this.isClosed) { return; }
1136
1183
 
1184
+ // allow the close to be stopped by returning `false`
1185
+ // from the `onBeforeClose` method
1137
1186
  var shouldClose = this.triggerMethod("before:close");
1138
1187
  if (shouldClose === false){
1139
1188
  return;
1140
1189
  }
1141
1190
 
1142
- this.remove();
1143
-
1144
- this.triggerMethod("close");
1191
+ // mark as closed before doing the actual close, to
1192
+ // prevent infinite loops within "close" event handlers
1193
+ // that are trying to close other views
1145
1194
  this.isClosed = true;
1146
1195
 
1196
+ this.remove();
1197
+ this.triggerMethod("close");
1147
1198
  this.unbindAll();
1148
1199
  },
1149
1200
 
@@ -1183,29 +1234,6 @@ Marionette.ItemView = Marionette.View.extend({
1183
1234
  if (this.initialEvents){
1184
1235
  this.initialEvents();
1185
1236
  }
1186
-
1187
- this.bindTo(this, "show", this._handleShow, this);
1188
- this.bindTo(this, "render", this._handleRender, this);
1189
- },
1190
-
1191
- // internal event handler to track when the view has been rendered
1192
- _handleShow: function(){
1193
- this._isShown = true;
1194
- this.triggerDOMRefresh();
1195
- },
1196
-
1197
- // internal event handler to track when the view has been shown in the DOM,
1198
- // using a Marionette.Region (or by other means of triggering "show")
1199
- _handleRender: function(){
1200
- this._isRendered = true;
1201
- this.triggerDOMRefresh();
1202
- },
1203
-
1204
- // Trigger the "dom:refresh" event and corresponding "onDomRefresh" method
1205
- triggerDOMRefresh: function(){
1206
- if (this._isShown && this._isRendered){
1207
- this.triggerMethod("dom:refresh");
1208
- }
1209
1237
  },
1210
1238
 
1211
1239
  // Serialize the model or collection for the view. If a model is
@@ -1279,12 +1307,12 @@ Marionette.CollectionView = Marionette.View.extend({
1279
1307
  // constructor
1280
1308
  constructor: function(options){
1281
1309
  this.initChildViewStorage();
1310
+ this.onShowCallbacks = new Marionette.Callbacks();
1282
1311
 
1283
1312
  var args = Array.prototype.slice.apply(arguments);
1284
1313
  Marionette.View.prototype.constructor.apply(this, args);
1285
1314
 
1286
1315
  this.initialEvents();
1287
- this.onShowCallbacks = new Marionette.Callbacks();
1288
1316
  },
1289
1317
 
1290
1318
  // Configured the initial events that the collection view
@@ -1419,6 +1447,9 @@ Marionette.CollectionView = Marionette.View.extend({
1419
1447
  // set up the child view event forwarding
1420
1448
  this.addChildViewEventForwarding(view);
1421
1449
 
1450
+ // this view is about to be added
1451
+ this.triggerMethod("before:item:added", view);
1452
+
1422
1453
  // Store the child view itself so we can properly
1423
1454
  // remove and/or close it later
1424
1455
  this.children.add(view);
@@ -1426,8 +1457,8 @@ Marionette.CollectionView = Marionette.View.extend({
1426
1457
  // Render it and show it
1427
1458
  var renderResult = this.renderItemView(view, index);
1428
1459
 
1429
- // let the world know this view was added
1430
- this.triggerMethod("item:added", view);
1460
+ // this view was added
1461
+ this.triggerMethod("after:item:added", view);
1431
1462
 
1432
1463
  // call onShow for child item views
1433
1464
  if (view.onShow){
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: marionette-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.rc1
4
+ version: 1.0.0.rc2
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors: