teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

コードの修正

2016/10/27 08:24

投稿

tarotarosu
tarotarosu

スコア114

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

コードの修正

2016/10/27 08:24

投稿

tarotarosu
tarotarosu

スコア114

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: 'list1',
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(this.template);
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

具体的なコードの追加

2016/10/27 08:22

投稿

tarotarosu
tarotarosu

スコア114

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に関係なく、クラス間でうまいこと変数を受け渡しできればいいのかなーと思うのですが、良い実装方法が思い浮かびません…