PageRenderTime 43ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/test/view.js

https://github.com/fantactuka/backbone
JavaScript | 327 lines | 258 code | 69 blank | 0 comment | 0 complexity | b4ccd2a3ccec34486d04a124f4b9b08e MD5 | raw file
  1. (function() {
  2. var view;
  3. module("Backbone.View", {
  4. setup: function() {
  5. view = new Backbone.View({
  6. id : 'test-view',
  7. className : 'test-view',
  8. other : 'non-special-option'
  9. });
  10. }
  11. });
  12. test("constructor", 3, function() {
  13. equal(view.el.id, 'test-view');
  14. equal(view.el.className, 'test-view');
  15. equal(view.el.other, void 0);
  16. });
  17. test("jQuery", 1, function() {
  18. var view = new Backbone.View;
  19. view.setElement('<p><a><b>test</b></a></p>');
  20. strictEqual(view.$('a b').html(), 'test');
  21. });
  22. test("initialize", 1, function() {
  23. var View = Backbone.View.extend({
  24. initialize: function() {
  25. this.one = 1;
  26. }
  27. });
  28. strictEqual(new View().one, 1);
  29. });
  30. test("delegateEvents", 6, function() {
  31. var counter1 = 0, counter2 = 0;
  32. var view = new Backbone.View({el: '#testElement'});
  33. view.increment = function(){ counter1++; };
  34. view.$el.on('click', function(){ counter2++; });
  35. var events = {'click h1': 'increment'};
  36. view.delegateEvents(events);
  37. view.$('h1').trigger('click');
  38. equal(counter1, 1);
  39. equal(counter2, 1);
  40. view.$('h1').trigger('click');
  41. equal(counter1, 2);
  42. equal(counter2, 2);
  43. view.delegateEvents(events);
  44. view.$('h1').trigger('click');
  45. equal(counter1, 3);
  46. equal(counter2, 3);
  47. });
  48. test("delegateEvents allows functions for callbacks", 3, function() {
  49. var view = new Backbone.View({el: '<p></p>'});
  50. view.counter = 0;
  51. var events = {
  52. click: function() {
  53. this.counter++;
  54. }
  55. };
  56. view.delegateEvents(events);
  57. view.$el.trigger('click');
  58. equal(view.counter, 1);
  59. view.$el.trigger('click');
  60. equal(view.counter, 2);
  61. view.delegateEvents(events);
  62. view.$el.trigger('click');
  63. equal(view.counter, 3);
  64. });
  65. test("delegateEvents ignore undefined methods", 0, function() {
  66. var view = new Backbone.View({el: '<p></p>'});
  67. view.delegateEvents({'click': 'undefinedMethod'});
  68. view.$el.trigger('click');
  69. });
  70. test("undelegateEvents", 6, function() {
  71. var counter1 = 0, counter2 = 0;
  72. var view = new Backbone.View({el: '#testElement'});
  73. view.increment = function(){ counter1++; };
  74. view.$el.on('click', function(){ counter2++; });
  75. var events = {'click h1': 'increment'};
  76. view.delegateEvents(events);
  77. view.$('h1').trigger('click');
  78. equal(counter1, 1);
  79. equal(counter2, 1);
  80. view.undelegateEvents();
  81. view.$('h1').trigger('click');
  82. equal(counter1, 1);
  83. equal(counter2, 2);
  84. view.delegateEvents(events);
  85. view.$('h1').trigger('click');
  86. equal(counter1, 2);
  87. equal(counter2, 3);
  88. });
  89. test("_ensureElement with DOM node el", 1, function() {
  90. var View = Backbone.View.extend({
  91. el: document.body
  92. });
  93. equal(new View().el, document.body);
  94. });
  95. test("_ensureElement with string el", 3, function() {
  96. var View = Backbone.View.extend({
  97. el: "body"
  98. });
  99. strictEqual(new View().el, document.body);
  100. View = Backbone.View.extend({
  101. el: "#testElement > h1"
  102. });
  103. strictEqual(new View().el, $("#testElement > h1").get(0));
  104. View = Backbone.View.extend({
  105. el: "#nonexistent"
  106. });
  107. ok(!new View().el);
  108. });
  109. test("with className and id functions", 2, function() {
  110. var View = Backbone.View.extend({
  111. className: function() {
  112. return 'className';
  113. },
  114. id: function() {
  115. return 'id';
  116. }
  117. });
  118. strictEqual(new View().el.className, 'className');
  119. strictEqual(new View().el.id, 'id');
  120. });
  121. test("with attributes", 2, function() {
  122. var View = Backbone.View.extend({
  123. attributes: {
  124. id: 'id',
  125. 'class': 'class'
  126. }
  127. });
  128. strictEqual(new View().el.className, 'class');
  129. strictEqual(new View().el.id, 'id');
  130. });
  131. test("with attributes as a function", 1, function() {
  132. var View = Backbone.View.extend({
  133. attributes: function() {
  134. return {'class': 'dynamic'};
  135. }
  136. });
  137. strictEqual(new View().el.className, 'dynamic');
  138. });
  139. test("multiple views per element", 3, function() {
  140. var count = 0;
  141. var $el = $('<p></p>');
  142. var View = Backbone.View.extend({
  143. el: $el,
  144. events: {
  145. click: function() {
  146. count++;
  147. }
  148. }
  149. });
  150. var view1 = new View;
  151. $el.trigger("click");
  152. equal(1, count);
  153. var view2 = new View;
  154. $el.trigger("click");
  155. equal(3, count);
  156. view1.delegateEvents();
  157. $el.trigger("click");
  158. equal(5, count);
  159. });
  160. test("custom events, with namespaces", 2, function() {
  161. var count = 0;
  162. var View = Backbone.View.extend({
  163. el: $('body'),
  164. events: function() {
  165. return {"fake$event.namespaced": "run"};
  166. },
  167. run: function() {
  168. count++;
  169. }
  170. });
  171. var view = new View;
  172. $('body').trigger('fake$event').trigger('fake$event');
  173. equal(count, 2);
  174. $('body').off('.namespaced');
  175. $('body').trigger('fake$event');
  176. equal(count, 2);
  177. });
  178. test("#1048 - setElement uses provided object.", 2, function() {
  179. var $el = $('body');
  180. var view = new Backbone.View({el: $el});
  181. ok(view.$el === $el);
  182. view.setElement($el = $($el));
  183. ok(view.$el === $el);
  184. });
  185. test("#986 - Undelegate before changing element.", 1, function() {
  186. var button1 = $('<button></button>');
  187. var button2 = $('<button></button>');
  188. var View = Backbone.View.extend({
  189. events: {
  190. click: function(e) {
  191. ok(view.el === e.target);
  192. }
  193. }
  194. });
  195. var view = new View({el: button1});
  196. view.setElement(button2);
  197. button1.trigger('click');
  198. button2.trigger('click');
  199. });
  200. test("#1172 - Clone attributes object", 2, function() {
  201. var View = Backbone.View.extend({
  202. attributes: {foo: 'bar'}
  203. });
  204. var view1 = new View({id: 'foo'});
  205. strictEqual(view1.el.id, 'foo');
  206. var view2 = new View();
  207. ok(!view2.el.id);
  208. });
  209. test("#1228 - tagName can be provided as a function", 1, function() {
  210. var View = Backbone.View.extend({
  211. tagName: function() {
  212. return 'p';
  213. }
  214. });
  215. ok(new View().$el.is('p'));
  216. });
  217. test("views stopListening", 0, function() {
  218. var View = Backbone.View.extend({
  219. initialize: function() {
  220. this.listenTo(this.model, 'all x', function(){ ok(false); }, this);
  221. this.listenTo(this.collection, 'all x', function(){ ok(false); }, this);
  222. }
  223. });
  224. var view = new View({
  225. model: new Backbone.Model,
  226. collection: new Backbone.Collection
  227. });
  228. view.stopListening();
  229. view.model.trigger('x');
  230. view.collection.trigger('x');
  231. });
  232. test("Provide function for el.", 2, function() {
  233. var View = Backbone.View.extend({
  234. el: function() {
  235. return "<p><a></a></p>";
  236. }
  237. });
  238. var view = new View;
  239. ok(view.$el.is('p'));
  240. ok(view.$el.has('a'));
  241. });
  242. test("events passed in options", 1, function() {
  243. var counter = 0;
  244. var View = Backbone.View.extend({
  245. el: '#testElement',
  246. increment: function() {
  247. counter++;
  248. }
  249. });
  250. var view = new View({
  251. events: {
  252. 'click h1': 'increment'
  253. }
  254. });
  255. view.$('h1').trigger('click').trigger('click');
  256. equal(counter, 2);
  257. });
  258. })();