appetizer-ui 0.7.1 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/appetizer-ui.gemspec +1 -1
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/appetizerExtensions.spec.js +54 -0
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/checkboxConventionBindings.spec.js +110 -0
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/configurableBindingAttributes.spec.js +117 -0
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/configureAllBindingAttributes.spec.js +139 -0
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/customConvention.spec.js +53 -0
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/dataBindConvention.spec.js +151 -0
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/dataBindMultiple.spec.js +36 -0
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/dataBindSubstitutions.spec.js +137 -0
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/globalConfiguraAllBindingAttributes.spec.js +124 -0
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/globalConfigurableBindingAttributes.spec.js +36 -0
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/helpers/SpecHelper.js +4 -0
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/helpers/sample.backbone.app.js +159 -0
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/html5inputConventionBinding.spec.js +142 -0
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/modelUnbinding.spec.js +73 -0
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/noConflict.spec.js +36 -0
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/radioButtonConventionBinding.spec.js +41 -0
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/selectboxConventionBindings.spec.js +60 -0
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/textareaConventionBinding.spec.js +29 -0
- data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/textboxConventionBinding.spec.js +66 -0
- data/lib/appetizer/ui/jasmine/js/jasmine-jquery-matchers.js +1 -1
- data/lib/appetizer/ui/jasmine/js/spec-runner.coffee +1 -0
- data/lib/appetizer/ui/vendor/js/backbone.modelbinding.js +68 -10
- metadata +45 -26
data/lib/appetizer/ui/jasmine/js/backbone.modelbinding/globalConfigurableBindingAttributes.spec.js
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
describe("globalConfigurableBindingAttributes", function(){
|
2
|
+
beforeEach(function(){
|
3
|
+
Backbone.ModelBinding.Configuration.store();
|
4
|
+
Backbone.ModelBinding.Configuration.configureBindingAttributes({text: "modelAttr"});
|
5
|
+
|
6
|
+
this.model = new AModel({ weakness: "liver & onions" });
|
7
|
+
this.view = new AView({model: this.model});
|
8
|
+
this.view.render();
|
9
|
+
});
|
10
|
+
|
11
|
+
afterEach(function(){
|
12
|
+
Backbone.ModelBinding.Configuration.restore();
|
13
|
+
});
|
14
|
+
|
15
|
+
describe("text element binding with global configuration of convention attribute", function(){
|
16
|
+
it("bind view changes to the model's field, by configurable convention", function(){
|
17
|
+
var el = this.view.$("#super_hero_weakness");
|
18
|
+
el.val("spinach");
|
19
|
+
el.trigger('change');
|
20
|
+
|
21
|
+
expect(this.model.get('weakness')).toEqual("spinach");
|
22
|
+
});
|
23
|
+
|
24
|
+
it("bind model field changes to the form input, by convention of id", function(){
|
25
|
+
this.model.set({weakness: "broccoli"});
|
26
|
+
var el = this.view.$("#super_hero_weakness");
|
27
|
+
expect(el.val()).toEqual("broccoli");
|
28
|
+
});
|
29
|
+
|
30
|
+
it("binds the model's value to the form field on render", function(){
|
31
|
+
var el = this.view.$("#super_hero_weakness");
|
32
|
+
expect(el.val()).toEqual("liver & onions");
|
33
|
+
});
|
34
|
+
});
|
35
|
+
|
36
|
+
});
|
@@ -0,0 +1,159 @@
|
|
1
|
+
AModel = Backbone.Model.extend({urlRoot: "/foo"});
|
2
|
+
|
3
|
+
AppetizerView = Backbone.View.extend({
|
4
|
+
render: function(){
|
5
|
+
var html = $("\
|
6
|
+
<div id='villain' data-bind='text villain' />\
|
7
|
+
<div id='mrNice' data-bind='text niceDude' />\
|
8
|
+
<div id='pet' data-bind='text pet.smelly' />\
|
9
|
+
<div id='country' data-bind='text country.withFood.hasWine' />\
|
10
|
+
<input type='text' id='usa' modelAttr='country.withFood.hasBurgers'>\
|
11
|
+
<input type='text' id='cat' modelAttr='pet.fluffy'>\
|
12
|
+
");
|
13
|
+
$(this.el).append(html).appendTo(sandbox());
|
14
|
+
Backbone.ModelBinding.bind(this, { text: "modelAttr" });
|
15
|
+
}
|
16
|
+
});
|
17
|
+
|
18
|
+
AView = Backbone.View.extend({
|
19
|
+
render: function(){
|
20
|
+
var html = $("\
|
21
|
+
<div id='eventDiv' data-bind='text event:foo' />\
|
22
|
+
<img id='avatar' data-bind='src urlSrc; class name'>\
|
23
|
+
<input id='noType'>\
|
24
|
+
<div id='showHideThing' data-bind='displayed isValid' />\
|
25
|
+
<div id='showHideAnotherThing' data-bind='hidden isValid' />\
|
26
|
+
<button id='unclicker' data-bind='disabled isValid'>Click Me!</button>\
|
27
|
+
<button id='clicker' data-bind='enabled isValid'>Click Me!</button>\
|
28
|
+
<div id='villain' data-bind='html villain'><p>test</p></div>\
|
29
|
+
<div id='doctor_no_elem' data-bind='doctor'>Seuss</div>\
|
30
|
+
<div id='doctor_data_bind_bb' data-bind-bb='doctor'>Seuss</div>\
|
31
|
+
<div id='doctor' data-bind='text doctor'>Seuss</div>\
|
32
|
+
<div id='pet' data-bind='someAttr pet' someAttr='Cat'></div>\
|
33
|
+
<input type='text' id='super_hero_weakness' modelAttr='weakness'>\
|
34
|
+
<input type='text' id='something'> \
|
35
|
+
<div id='showIt'></div>\
|
36
|
+
<input type='text' id='prefilled_name' value='a name'>\
|
37
|
+
<input type='text' id='name'>\
|
38
|
+
<select id='operating_system'> \
|
39
|
+
<option value='osx'>osx</option> \
|
40
|
+
<option value='windows'>windows</option> \
|
41
|
+
<option value='linux'>linux</option> \
|
42
|
+
</select> \
|
43
|
+
<select id='education'> \
|
44
|
+
<option value='none'>none</option> \
|
45
|
+
<option value='grade_school'>i dun learned at grade skool</option> \
|
46
|
+
<option value='high school'>high school</option> \
|
47
|
+
<option value='college'>college</option> \
|
48
|
+
<option value='graduate'>graduate</option> \
|
49
|
+
</select> \
|
50
|
+
<select id='age_level'> \
|
51
|
+
<option value=''>-- select --</option> \
|
52
|
+
<option value='0'>under 20</option> \
|
53
|
+
<option value='21'>21 - 40</option> \
|
54
|
+
<option value='41'>over 41</option> \
|
55
|
+
</select> \
|
56
|
+
<select id='another_select'> \
|
57
|
+
<option value='pre_selected' selected='selected'>pre selected</option> \
|
58
|
+
<option value='not_selected'>not selected</option> \
|
59
|
+
</select> \
|
60
|
+
<input type='radio' id='graduated_yes' name='graduated' value='yes'>\
|
61
|
+
<input type='radio' id='graduated_no' name='graduated' value='no'>\
|
62
|
+
<input type='radio' id='graduated_maybe' name='graduated' value='maybe'>\
|
63
|
+
<input type='radio' id='us_citizen_true' name='us_citizen' value='true'>\
|
64
|
+
<input type='radio' id='us_citizen_false' name='us_citizen' value='false'>\
|
65
|
+
<input type='radio' id='another_radio_true' name='another_radio' value='true' checked='checked'>\
|
66
|
+
<input type='radio' id='another_radio_false' name='another_radio' value='false'>\
|
67
|
+
<input type='checkbox' id='drivers_license' value='yes'>\
|
68
|
+
<input type='checkbox' id='motorcycle_license' value='yes' checked='checked'>\
|
69
|
+
<input type='checkbox' id='binary_checkbox' value='yes'>\
|
70
|
+
<textarea id='bio'></textarea>\
|
71
|
+
<p id='aParagraph'></p>\
|
72
|
+
<input type='password' id='password'>\
|
73
|
+
<input type='number' id='number'>\
|
74
|
+
<input type='range' id='range' min='0' max='98765'>\
|
75
|
+
<input type='email' id='email'>\
|
76
|
+
<input type='url' id='urlSrc'>\
|
77
|
+
<input type='tel' id='tel'>\
|
78
|
+
<input type='search' id='search'>\
|
79
|
+
");
|
80
|
+
$(this.el).append(html).appendTo(sandbox());
|
81
|
+
Backbone.ModelBinding.bind(this);
|
82
|
+
}
|
83
|
+
});
|
84
|
+
|
85
|
+
AllBindingAttributesView = Backbone.View.extend({
|
86
|
+
render: function(){
|
87
|
+
var html = $("\
|
88
|
+
<input type='text' id='v_name' class='name'> \
|
89
|
+
<select id='v_education' class='education'> \
|
90
|
+
<option value='none'>none</option> \
|
91
|
+
<option value='grade_school'>i dun learned at grade skool</option> \
|
92
|
+
<option value='high school'>high school</option> \
|
93
|
+
<option value='college'>college</option> \
|
94
|
+
<option value='graduate'>graduate</option> \
|
95
|
+
</select> \
|
96
|
+
<input type='radio' id='graduated_yes' name='graduated' class='graduated' value='yes'>\
|
97
|
+
<input type='radio' id='graduated_no' name='graduated' class='graduated' value='no'>\
|
98
|
+
<input type='radio' id='graduated_maybe' name='graduated' class='graduated' value='maybe'>\
|
99
|
+
<input type='checkbox' id='v_drivers_license' class='drivers_license' value='yes'>\
|
100
|
+
<textarea id='v_bio' class='bio'></textarea>\
|
101
|
+
");
|
102
|
+
$(this.el).append(html).appendTo(sandbox());
|
103
|
+
|
104
|
+
Backbone.ModelBinding.bind(this, {all: "class"});
|
105
|
+
}
|
106
|
+
});
|
107
|
+
|
108
|
+
GlobalAllBindingAttributesView = Backbone.View.extend({
|
109
|
+
render: function(){
|
110
|
+
var html = $("\
|
111
|
+
<input type='text' id='v_name' class='name'> \
|
112
|
+
<select id='v_education' class='education'> \
|
113
|
+
<option value='none'>none</option> \
|
114
|
+
<option value='grade_school'>i dun learned at grade skool</option> \
|
115
|
+
<option value='high school'>high school</option> \
|
116
|
+
<option value='college'>college</option> \
|
117
|
+
<option value='graduate'>graduate</option> \
|
118
|
+
</select> \
|
119
|
+
<input type='radio' id='graduated_yes' name='graduated' class='graduated' value='yes'>\
|
120
|
+
<input type='radio' id='graduated_no' name='graduated' class='graduated' value='no'>\
|
121
|
+
<input type='radio' id='graduated_maybe' name='graduated' class='graduated' value='maybe'>\
|
122
|
+
<input type='checkbox' id='v_drivers_license' class='drivers_license' value='yes'>\
|
123
|
+
<textarea id='v_bio' class='bio'></textarea>\
|
124
|
+
");
|
125
|
+
$(this.el).append(html).appendTo(sandbox());
|
126
|
+
|
127
|
+
Backbone.ModelBinding.bind(this);
|
128
|
+
}
|
129
|
+
});
|
130
|
+
|
131
|
+
AnotherView = Backbone.View.extend({
|
132
|
+
render: function(){
|
133
|
+
var html = $("\
|
134
|
+
<input type='text' class='super_power' modelAttr='weakness'>\
|
135
|
+
<select class='education'> \
|
136
|
+
<option value='none'>none</option> \
|
137
|
+
<option value='grade_school'>i dun learned at grade skool</option> \
|
138
|
+
<option value='high school'>high school</option> \
|
139
|
+
<option value='college'>college</option> \
|
140
|
+
<option value='graduate'>graduate</option> \
|
141
|
+
</select> \
|
142
|
+
<input type='radio' id='graduated_yes' class='graduated' value='yes'>\
|
143
|
+
<input type='radio' id='graduated_no' class='graduated' value='no'>\
|
144
|
+
<input type='radio' id='graduated_maybe' class='graduated' value='maybe'>\
|
145
|
+
<input type='checkbox' class='drivers_license' value='yes'>\
|
146
|
+
");
|
147
|
+
|
148
|
+
$(this.el).append(html).appendTo(sandbox());
|
149
|
+
|
150
|
+
Backbone.ModelBinding.bind(this, {
|
151
|
+
text: 'class',
|
152
|
+
textarea: 'class',
|
153
|
+
password: 'class',
|
154
|
+
radio: 'class',
|
155
|
+
select: 'class',
|
156
|
+
checkbox: 'class',
|
157
|
+
});
|
158
|
+
}
|
159
|
+
});
|
@@ -0,0 +1,142 @@
|
|
1
|
+
describe("HTML5 input convention bindings", function(){
|
2
|
+
beforeEach(function(){
|
3
|
+
this.model = new AModel({
|
4
|
+
number: "1234",
|
5
|
+
range: "65",
|
6
|
+
tel: "321-123-1222",
|
7
|
+
search: "search text",
|
8
|
+
urlSrc: "http:\\\\url.com",
|
9
|
+
email: "email@domain.com"
|
10
|
+
});
|
11
|
+
this.view = new AView({model: this.model});
|
12
|
+
this.view.render();
|
13
|
+
});
|
14
|
+
|
15
|
+
describe("number element binding", function(){
|
16
|
+
it("bind view changes to the model's field, by convention of id", function(){
|
17
|
+
var el = this.view.$("#number");
|
18
|
+
el.val("09876");
|
19
|
+
el.trigger('change');
|
20
|
+
|
21
|
+
expect(this.model.get('number')).toEqual("09876");
|
22
|
+
});
|
23
|
+
|
24
|
+
it("bind model field changes to the form input, by convention of id", function(){
|
25
|
+
this.model.set({number: "45678"});
|
26
|
+
var el = this.view.$("#number");
|
27
|
+
expect(el.val()).toEqual("45678");
|
28
|
+
});
|
29
|
+
|
30
|
+
it("binds the model's value to the form field on render", function(){
|
31
|
+
var el = this.view.$("#number");
|
32
|
+
expect(el.val()).toEqual("1234");
|
33
|
+
});
|
34
|
+
});
|
35
|
+
|
36
|
+
describe("range element binding", function(){
|
37
|
+
it("bind view changes to the model's field, by convention of id", function(){
|
38
|
+
var el = this.view.$("#range");
|
39
|
+
el.val("9876");
|
40
|
+
el.trigger('change');
|
41
|
+
|
42
|
+
expect(this.model.get('range')).toEqual("9876");
|
43
|
+
});
|
44
|
+
|
45
|
+
it("bind model field changes to the form input, by convention of id", function(){
|
46
|
+
this.model.set({range: "45678"});
|
47
|
+
var el = this.view.$("#range");
|
48
|
+
expect(el.val()).toEqual("45678");
|
49
|
+
});
|
50
|
+
|
51
|
+
it("binds the model's value to the form field on render", function(){
|
52
|
+
var el = this.view.$("#range");
|
53
|
+
expect(el.val()).toEqual("65");
|
54
|
+
});
|
55
|
+
});
|
56
|
+
|
57
|
+
describe("tel element binding", function(){
|
58
|
+
it("bind view changes to the model's field, by convention of id", function(){
|
59
|
+
var el = this.view.$("#tel");
|
60
|
+
el.val("321-345-5555");
|
61
|
+
el.trigger('change');
|
62
|
+
|
63
|
+
expect(this.model.get('tel')).toEqual("321-345-5555");
|
64
|
+
});
|
65
|
+
|
66
|
+
it("bind model field changes to the form input, by convention of id", function(){
|
67
|
+
this.model.set({tel: "456-345-5555"});
|
68
|
+
var el = this.view.$("#tel");
|
69
|
+
expect(el.val()).toEqual("456-345-5555");
|
70
|
+
});
|
71
|
+
|
72
|
+
it("binds the model's value to the form field on render", function(){
|
73
|
+
var el = this.view.$("#tel");
|
74
|
+
expect(el.val()).toEqual("321-123-1222");
|
75
|
+
});
|
76
|
+
});
|
77
|
+
|
78
|
+
describe("search element binding", function(){
|
79
|
+
it("bind view changes to the model's field, by convention of id", function(){
|
80
|
+
var el = this.view.$("#search");
|
81
|
+
el.val("more text");
|
82
|
+
el.trigger('change');
|
83
|
+
|
84
|
+
expect(this.model.get('search')).toEqual("more text");
|
85
|
+
});
|
86
|
+
|
87
|
+
it("bind model field changes to the form input, by convention of id", function(){
|
88
|
+
this.model.set({search: "new text"});
|
89
|
+
var el = this.view.$("#search");
|
90
|
+
expect(el.val()).toEqual("new text");
|
91
|
+
});
|
92
|
+
|
93
|
+
it("binds the model's value to the form field on render", function(){
|
94
|
+
var el = this.view.$("#search");
|
95
|
+
expect(el.val()).toEqual("search text");
|
96
|
+
});
|
97
|
+
});
|
98
|
+
|
99
|
+
describe("url element binding", function(){
|
100
|
+
it("bind view changes to the model's field, by convention of id", function(){
|
101
|
+
var el = this.view.$("#urlSrc");
|
102
|
+
el.val("some url");
|
103
|
+
el.trigger('change');
|
104
|
+
|
105
|
+
expect(this.model.get('urlSrc')).toEqual("some url");
|
106
|
+
});
|
107
|
+
|
108
|
+
it("bind model field changes to the form input, by convention of id", function(){
|
109
|
+
this.model.set({urlSrc: "new url"});
|
110
|
+
var el = this.view.$("#urlSrc");
|
111
|
+
expect(el.val()).toEqual("new url");
|
112
|
+
});
|
113
|
+
|
114
|
+
it("binds the model's value to the form field on render", function(){
|
115
|
+
var el = this.view.$("#urlSrc");
|
116
|
+
expect(el.val()).toEqual("http:\\\\url.com");
|
117
|
+
});
|
118
|
+
});
|
119
|
+
|
120
|
+
describe("email element binding", function(){
|
121
|
+
it("bind view changes to the model's field, by convention of id", function(){
|
122
|
+
var el = this.view.$("#email");
|
123
|
+
el.val("new@email.com");
|
124
|
+
el.trigger('change');
|
125
|
+
|
126
|
+
expect(this.model.get('email')).toEqual("new@email.com");
|
127
|
+
});
|
128
|
+
|
129
|
+
it("bind model field changes to the form input, by convention of id", function(){
|
130
|
+
this.model.set({email: "more@email.gov"});
|
131
|
+
var el = this.view.$("#email");
|
132
|
+
expect(el.val()).toEqual("more@email.gov");
|
133
|
+
});
|
134
|
+
|
135
|
+
it("binds the model's value to the form field on render", function(){
|
136
|
+
var el = this.view.$("#email");
|
137
|
+
expect(el.val()).toEqual("email@domain.com");
|
138
|
+
});
|
139
|
+
});
|
140
|
+
|
141
|
+
|
142
|
+
});
|
@@ -0,0 +1,73 @@
|
|
1
|
+
describe("model unbinding", function(){
|
2
|
+
beforeEach(function(){
|
3
|
+
this.model = new AModel({
|
4
|
+
name: "a name",
|
5
|
+
bio: "a bio",
|
6
|
+
password: "it's a secret",
|
7
|
+
education: "college",
|
8
|
+
graduated: "no",
|
9
|
+
drivers_license: true,
|
10
|
+
isValid: true
|
11
|
+
});
|
12
|
+
this.view = new AView({model: this.model});
|
13
|
+
this.view.render();
|
14
|
+
});
|
15
|
+
|
16
|
+
describe("when unbinding a view should", function(){
|
17
|
+
beforeEach(function(){
|
18
|
+
Backbone.ModelBinding.unbind(this.view);
|
19
|
+
});
|
20
|
+
|
21
|
+
it("should unbind the text box", function(){
|
22
|
+
this.model.set({name: "some name change"});
|
23
|
+
var el = this.view.$("#name");
|
24
|
+
expect(el.val()).toEqual("a name");
|
25
|
+
});
|
26
|
+
|
27
|
+
it("should unbind the textarea", function(){
|
28
|
+
this.model.set({bio: "some change to my bio"});
|
29
|
+
var el = this.view.$("#bio");
|
30
|
+
expect(el.val()).toEqual("a bio");
|
31
|
+
});
|
32
|
+
|
33
|
+
it("should unbind the password", function(){
|
34
|
+
this.model.set({password: "this isn't it"});
|
35
|
+
var el = this.view.$("#password");
|
36
|
+
expect(el.val()).toEqual("it's a secret");
|
37
|
+
});
|
38
|
+
|
39
|
+
it("should unbind the select box", function(){
|
40
|
+
this.model.set({education: "none"});
|
41
|
+
var el = this.view.$("#education");
|
42
|
+
expect(el.val()).toEqual("college");
|
43
|
+
});
|
44
|
+
|
45
|
+
it("should unbind the radio group", function(){
|
46
|
+
this.model.set({graduated: "yes"});
|
47
|
+
|
48
|
+
var elYes = this.view.$("#graduated_yes");
|
49
|
+
var selected = elYes.attr("checked");
|
50
|
+
expect(selected).toBeFalsy();
|
51
|
+
|
52
|
+
var elNo = this.view.$("#graduated_no");
|
53
|
+
var selected = elNo.attr("checked");
|
54
|
+
expect(selected).toBeTruthy();
|
55
|
+
});
|
56
|
+
|
57
|
+
it("should unbind the checkbox", function(){
|
58
|
+
this.model.set({drivers_license: false});
|
59
|
+
var el = this.view.$("#drivers_license");
|
60
|
+
var selected = el.attr("checked");
|
61
|
+
expect(selected).toBeTruthy();
|
62
|
+
});
|
63
|
+
|
64
|
+
it("should unbind the data-bind", function(){
|
65
|
+
this.model.set({isValid: false});
|
66
|
+
var el = this.view.$("#clicker");
|
67
|
+
var disabled = el.attr("disabled");
|
68
|
+
expect(disabled).toBeFalsy();
|
69
|
+
});
|
70
|
+
});
|
71
|
+
|
72
|
+
});
|
73
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
describe("Backbone.noConflict", function(){
|
2
|
+
beforeEach(function(){
|
3
|
+
var that = this;
|
4
|
+
this.localBackbone = Backbone.noConflict();
|
5
|
+
this.localUnderscore = _.noConflict();
|
6
|
+
|
7
|
+
var Model = this.localBackbone.Model.extend({});
|
8
|
+
var View = this.localBackbone.View.extend({
|
9
|
+
render: function(){
|
10
|
+
var html = $("\
|
11
|
+
<input id='input'>\
|
12
|
+
<select id='select'> \
|
13
|
+
<option value='none'>none</option> \
|
14
|
+
</select> \
|
15
|
+
<input type='radio' id='radio' name='radio' value='yes'>\
|
16
|
+
<input type='checkbox' id='check' value='yes'>\
|
17
|
+
<button id='data' data-bind='disabled isValid'>Click Me!</button>\
|
18
|
+
");
|
19
|
+
this.$(this.el).append(html);
|
20
|
+
}
|
21
|
+
});
|
22
|
+
|
23
|
+
this.model = new Model();
|
24
|
+
this.view = new View({model: this.model});
|
25
|
+
this.view.render();
|
26
|
+
});
|
27
|
+
|
28
|
+
afterEach(function(){
|
29
|
+
Backbone = this.localBackbone;
|
30
|
+
_ = this.localUnderscore;
|
31
|
+
});
|
32
|
+
|
33
|
+
it("should use local copy of backbone when binding", function(){
|
34
|
+
this.localBackbone.ModelBinding.bind(this.view);
|
35
|
+
});
|
36
|
+
});
|