mirror of
https://github.com/jashkenas/backbone.git
synced 2026-01-14 17:37:54 -05:00
210 lines
5.5 KiB
JavaScript
210 lines
5.5 KiB
JavaScript
$(document).ready(function() {
|
|
|
|
var view;
|
|
|
|
module("Backbone.View", {
|
|
|
|
setup: function() {
|
|
view = new Backbone.View({
|
|
id : 'test-view',
|
|
className : 'test-view'
|
|
});
|
|
}
|
|
|
|
});
|
|
|
|
test("View: constructor", function() {
|
|
equal(view.el.id, 'test-view');
|
|
equal(view.el.className, 'test-view');
|
|
equal(view.options.id, 'test-view');
|
|
equal(view.options.className, 'test-view');
|
|
});
|
|
|
|
test("View: jQuery", function() {
|
|
view.setElement(document.body);
|
|
ok(view.$('#qunit-header a').get(0).innerHTML.match(/Backbone Test Suite/));
|
|
ok(view.$('#qunit-header a').get(1).innerHTML.match(/Backbone Speed Suite/));
|
|
});
|
|
|
|
test("View: make", function() {
|
|
var div = view.make('div', {id: 'test-div'}, "one two three");
|
|
equal(div.tagName.toLowerCase(), 'div');
|
|
equal(div.id, 'test-div');
|
|
equal($(div).text(), 'one two three');
|
|
});
|
|
|
|
test("View: initialize", function() {
|
|
var View = Backbone.View.extend({
|
|
initialize: function() {
|
|
this.one = 1;
|
|
}
|
|
});
|
|
var view = new View;
|
|
equal(view.one, 1);
|
|
});
|
|
|
|
test("View: delegateEvents", function() {
|
|
var counter = 0;
|
|
var counter2 = 0;
|
|
view.setElement(document.body);
|
|
view.increment = function(){ counter++; };
|
|
view.$el.bind('click', function(){ counter2++; });
|
|
var events = {"click #qunit-banner": "increment"};
|
|
view.delegateEvents(events);
|
|
$('#qunit-banner').trigger('click');
|
|
equal(counter, 1);
|
|
equal(counter2, 1);
|
|
$('#qunit-banner').trigger('click');
|
|
equal(counter, 2);
|
|
equal(counter2, 2);
|
|
view.delegateEvents(events);
|
|
$('#qunit-banner').trigger('click');
|
|
equal(counter, 3);
|
|
equal(counter2, 3);
|
|
});
|
|
|
|
test("View: delegateEvents allows functions for callbacks", function() {
|
|
view.counter = 0;
|
|
view.setElement("#qunit-banner");
|
|
var events = {"click": function() { this.counter++; }};
|
|
view.delegateEvents(events);
|
|
$('#qunit-banner').trigger('click');
|
|
equal(view.counter, 1);
|
|
$('#qunit-banner').trigger('click');
|
|
equal(view.counter, 2);
|
|
view.delegateEvents(events);
|
|
$('#qunit-banner').trigger('click');
|
|
equal(view.counter, 3);
|
|
});
|
|
|
|
test("View: undelegateEvents", function() {
|
|
var counter = 0;
|
|
var counter2 = 0;
|
|
view.setElement(document.body);
|
|
view.increment = function(){ counter++; };
|
|
$(view.el).unbind('click');
|
|
$(view.el).bind('click', function(){ counter2++; });
|
|
var events = {"click #qunit-userAgent": "increment"};
|
|
view.delegateEvents(events);
|
|
$('#qunit-userAgent').trigger('click');
|
|
equal(counter, 1);
|
|
equal(counter2, 1);
|
|
view.undelegateEvents();
|
|
$('#qunit-userAgent').trigger('click');
|
|
equal(counter, 1);
|
|
equal(counter2, 2);
|
|
view.delegateEvents(events);
|
|
$('#qunit-userAgent').trigger('click');
|
|
equal(counter, 2);
|
|
equal(counter2, 3);
|
|
});
|
|
|
|
test("View: _ensureElement with DOM node el", function() {
|
|
var ViewClass = Backbone.View.extend({
|
|
el: document.body
|
|
});
|
|
var view = new ViewClass;
|
|
equal(view.el, document.body);
|
|
});
|
|
|
|
test("View: _ensureElement with string el", function() {
|
|
var ViewClass = Backbone.View.extend({
|
|
el: "body"
|
|
});
|
|
var view = new ViewClass;
|
|
equal(view.el, document.body);
|
|
|
|
ViewClass = Backbone.View.extend({
|
|
el: "body > h2"
|
|
});
|
|
view = new ViewClass;
|
|
equal(view.el, $("#qunit-banner").get(0));
|
|
|
|
ViewClass = Backbone.View.extend({
|
|
el: "#nonexistent"
|
|
});
|
|
view = new ViewClass;
|
|
ok(!view.el);
|
|
});
|
|
|
|
test("View: with attributes", function() {
|
|
var view = new Backbone.View({attributes : {'class': 'one', id: 'two'}});
|
|
equal(view.el.className, 'one');
|
|
equal(view.el.id, 'two');
|
|
});
|
|
|
|
test("View: with attributes as a function", function() {
|
|
var viewClass = Backbone.View.extend({
|
|
attributes: function() {
|
|
return {'class': 'dynamic'};
|
|
}
|
|
});
|
|
equal((new viewClass).el.className, 'dynamic');
|
|
});
|
|
|
|
test("View: multiple views per element", function() {
|
|
var count = 0, ViewClass = Backbone.View.extend({
|
|
el: $("body"),
|
|
events: {
|
|
"click": "click"
|
|
},
|
|
click: function() {
|
|
count++;
|
|
}
|
|
});
|
|
|
|
var view1 = new ViewClass;
|
|
$("body").trigger("click");
|
|
equal(1, count);
|
|
|
|
var view2 = new ViewClass;
|
|
$("body").trigger("click");
|
|
equal(3, count);
|
|
|
|
view1.delegateEvents();
|
|
$("body").trigger("click");
|
|
equal(5, count);
|
|
});
|
|
|
|
test("View: custom events, with namespaces", function() {
|
|
var count = 0;
|
|
var ViewClass = Backbone.View.extend({
|
|
el: $('body'),
|
|
events: function() {
|
|
return {"fake$event.namespaced": "run"};
|
|
},
|
|
run: function() {
|
|
count++;
|
|
}
|
|
});
|
|
|
|
var view = new ViewClass;
|
|
$('body').trigger('fake$event').trigger('fake$event');
|
|
equal(count, 2);
|
|
$('body').unbind('.namespaced');
|
|
$('body').trigger('fake$event');
|
|
equal(count, 2);
|
|
});
|
|
|
|
test("#1048 - setElement uses provided object.", function() {
|
|
var $el = $('body');
|
|
var view = new Backbone.View({el: $el});
|
|
ok(view.$el === $el);
|
|
view.setElement($el = $($el));
|
|
ok(view.$el === $el);
|
|
});
|
|
|
|
test("#986 - Undelegate before changing element.", 1, function() {
|
|
var a = $('<button></button>');
|
|
var b = $('<button></button>');
|
|
var View = Backbone.View.extend({
|
|
events: {click: function(e) { ok(view.el === e.target); }}
|
|
});
|
|
var view = new View({el: a});
|
|
view.setElement(b);
|
|
a.trigger('click');
|
|
b.trigger('click');
|
|
});
|
|
|
|
});
|