質問編集履歴
3
コードの修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -61,6 +61,8 @@
|
|
61
61
|
|
62
62
|
###Backbone.jsでの記述
|
63
63
|
```javascript
|
64
|
+
var listText;
|
65
|
+
|
64
66
|
//liのModel
|
65
67
|
var LiModel = Backbone.Model.extend({
|
66
68
|
defaults: {
|
2
コードの修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -52,6 +52,13 @@
|
|
52
52
|
|
53
53
|
これを私なりにBackbone.jsを使って書き換えると、以下のようなコードになりました。
|
54
54
|
|
55
|
+
###テンプレート
|
56
|
+
```html
|
57
|
+
<script type="text/template" id="text-template">
|
58
|
+
<%- text %>
|
59
|
+
</script>
|
60
|
+
```
|
61
|
+
|
55
62
|
###Backbone.jsでの記述
|
56
63
|
```javascript
|
57
64
|
//liのModel
|
@@ -64,7 +71,7 @@
|
|
64
71
|
//liのView
|
65
72
|
var LiView = Backbone.View.extend({
|
66
73
|
tagName: 'li',
|
67
|
-
template: '
|
74
|
+
template: _.template($('#text-template').html()),
|
68
75
|
events: {
|
69
76
|
'click': 'getText'
|
70
77
|
},
|
@@ -72,7 +79,8 @@
|
|
72
79
|
listText = this.model.get('text');
|
73
80
|
},
|
74
81
|
render: function(){
|
82
|
+
var template = this.template(this.model.toJSON());
|
75
|
-
this.$el.html(
|
83
|
+
this.$el.html(template);
|
76
84
|
return this;
|
77
85
|
}
|
78
86
|
});
|
@@ -92,9 +100,13 @@
|
|
92
100
|
var liView = new LiView({model: liModel});
|
93
101
|
$('.demo').append(view.render().el);
|
94
102
|
var buttonView = new ButtonView();
|
103
|
+
|
95
104
|
```
|
96
105
|
|
97
106
|
このような処理をBackbone.js的に実装しようとしても、「listText」というグローバル変数を記述するような方法でコーディングしてしまいます。
|
98
107
|
この程度ならlistTextが存在しても何の問題もないのですが、実装したい機能としてはもっと複雑で、listTextが様々な処理に絡み、listTextのような変数もかなり増えてくることが予想されます。
|
99
108
|
|
100
|
-
Backbone.jsに関係なく、クラス間でうまいこと変数を受け渡しできればいいのかなーと思うのですが、良い実装方法が思い浮かびません…
|
109
|
+
Backbone.jsに関係なく、クラス間でうまいこと変数を受け渡しできればいいのかなーと思うのですが、良い実装方法が思い浮かびません…
|
110
|
+
|
111
|
+
###追記2
|
112
|
+
liのViewがおかしかったので少し修正しました
|
1
具体的なコードの追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -16,4 +16,85 @@
|
|
16
16
|
global_1;
|
17
17
|
global_2;
|
18
18
|
global_3;
|
19
|
-
```
|
19
|
+
```
|
20
|
+
|
21
|
+
###追記
|
22
|
+
より具体的な例で説明します。
|
23
|
+
<li>をクリックしたらその<li>内のテキストを取得して、<button>がクリックされたら先ほど取得したテキストを表示する。
|
24
|
+
という処理をjQueryだけでは以下のように記述しました。
|
25
|
+
|
26
|
+
###HTML
|
27
|
+
```html
|
28
|
+
<div class="demo">
|
29
|
+
<ul>
|
30
|
+
<li id="list1">list1</li>
|
31
|
+
<li id="list2">list2</li>
|
32
|
+
<li id="list3">list3</li>
|
33
|
+
</ul>
|
34
|
+
<button type="button" id="button">Button</button>
|
35
|
+
</div>
|
36
|
+
```
|
37
|
+
|
38
|
+
###jQueryでの記述
|
39
|
+
```javascript
|
40
|
+
$(function(){
|
41
|
+
var listText;
|
42
|
+
|
43
|
+
$('.demo li').click(function(){
|
44
|
+
listText = $(this).text();
|
45
|
+
});
|
46
|
+
|
47
|
+
$('#button').click(function(){
|
48
|
+
console.log(listText);
|
49
|
+
});
|
50
|
+
});
|
51
|
+
```
|
52
|
+
|
53
|
+
これを私なりにBackbone.jsを使って書き換えると、以下のようなコードになりました。
|
54
|
+
|
55
|
+
###Backbone.jsでの記述
|
56
|
+
```javascript
|
57
|
+
//liのModel
|
58
|
+
var LiModel = Backbone.Model.extend({
|
59
|
+
defaults: {
|
60
|
+
text: 'list1'
|
61
|
+
}
|
62
|
+
});
|
63
|
+
|
64
|
+
//liのView
|
65
|
+
var LiView = Backbone.View.extend({
|
66
|
+
tagName: 'li',
|
67
|
+
template: 'list1',
|
68
|
+
events: {
|
69
|
+
'click': 'getText'
|
70
|
+
},
|
71
|
+
getText: function(){
|
72
|
+
listText = this.model.get('text');
|
73
|
+
},
|
74
|
+
render: function(){
|
75
|
+
this.$el.html(this.template);
|
76
|
+
return this;
|
77
|
+
}
|
78
|
+
});
|
79
|
+
|
80
|
+
//ボタンのView
|
81
|
+
var ButtonView = Backbone.View.extend({
|
82
|
+
el: '#button',
|
83
|
+
events: {
|
84
|
+
'click': 'showText'
|
85
|
+
},
|
86
|
+
showText: function(){
|
87
|
+
console.log(listText);
|
88
|
+
}
|
89
|
+
});
|
90
|
+
|
91
|
+
var liModel = new LiModel();
|
92
|
+
var liView = new LiView({model: liModel});
|
93
|
+
$('.demo').append(view.render().el);
|
94
|
+
var buttonView = new ButtonView();
|
95
|
+
```
|
96
|
+
|
97
|
+
このような処理をBackbone.js的に実装しようとしても、「listText」というグローバル変数を記述するような方法でコーディングしてしまいます。
|
98
|
+
この程度ならlistTextが存在しても何の問題もないのですが、実装したい機能としてはもっと複雑で、listTextが様々な処理に絡み、listTextのような変数もかなり増えてくることが予想されます。
|
99
|
+
|
100
|
+
Backbone.jsに関係なく、クラス間でうまいこと変数を受け渡しできればいいのかなーと思うのですが、良い実装方法が思い浮かびません…
|