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

回答編集履歴

3

fix typo

2017/02/10 04:48

投稿

yamato_hikawa
yamato_hikawa

スコア2092

answer CHANGED
@@ -148,7 +148,7 @@
148
148
  $.ajax({
149
149
  type: 'GET',
150
150
  dataType: 'json',
151
- url: 'samole.json',
151
+ url: 'sample.json',
152
152
  cache: false
153
153
  }).done(function(data) {
154
154
  // tasksにデータを挿入

2

要件達成まで加筆

2017/02/10 04:48

投稿

yamato_hikawa
yamato_hikawa

スコア2092

answer CHANGED
@@ -68,4 +68,113 @@
68
68
  },
69
69
  },
70
70
  });
71
+ ```
72
+
73
+ ## 第二段階
74
+ JSONファイルを作成して別ファイル化します。
75
+ JSONデータはキーと文字列を全てダブルクォート`"`で囲います(真偽値と数値は囲わないこと)。
76
+ JSONのフォーマットに合わせて、余計なセミコロンとカンマを削除するのを忘れずに。
77
+
78
+ ```json
79
+ [{
80
+ "finished": false, ←キーを""で囲う
81
+ "name": "test1" ←文字列を""で囲う
82
+ }, {
83
+ "finished": false,
84
+ "name": "test2"
85
+ }, {
86
+ "finished": false,
87
+ "name": "test3"
88
+ }] ← 最後のカンマ、セミコロンは取る
89
+ ```
90
+
91
+ ## 第三段階
92
+ beforeCreate関数を使い、tasksにajaxで取得したデータを挿入します。
93
+ 一旦これでうまくいきました。
94
+
95
+ ```javascript
96
+ var FormComponent = {
97
+ template: `<form v-on:submit.prevent="form_submit">
98
+ <div>
99
+ <input v-model="task.name" type="text">
100
+ <span>
101
+ <button class="btn btn-primary">追加</button>
102
+ </span>
103
+ </div>
104
+ </form>`,
105
+ props: [
106
+ 'task',
107
+ 'on-submit',
108
+ ],
109
+ methods: {
110
+ form_submit: function(event) {
111
+ if (!this.task.name) {
112
+ return;
113
+ }
114
+ this.onSubmit(event, this.task);
115
+ },
116
+ },
117
+ };
118
+
119
+ var ItemComponent = {
120
+ template: `<label class="list-group-item">
121
+ <span v-on:click.prevent="edit_click" class="pull-right btn btn-success">編集</span>
122
+ <input v-model="task.finished" type="checkbox">
123
+ {{task.name}}
124
+ </label>`,
125
+ props: [
126
+ 'task',
127
+ ],
128
+ methods: {
129
+ edit_click: function(event) {
130
+ var newName = window.prompt('Task Name', this.task.name);
131
+ this.task.name = newName;
132
+ },
133
+ },
134
+ };
135
+
136
+ window.app = new Vue({
137
+ el: '#app',
138
+ components: {
139
+ 'form_component': FormComponent,
140
+ 'item_component': ItemComponent,
141
+ },
142
+ beforeCreate: function() {
143
+ /* ajax関数内でthis.tasksにアクセスするため
144
+ thisをキャッシュする。
145
+ */
146
+ var _self = this;
147
+
148
+ $.ajax({
149
+ type: 'GET',
150
+ dataType: 'json',
151
+ url: 'samole.json',
152
+ cache: false
153
+ }).done(function(data) {
154
+ // tasksにデータを挿入
155
+ _self.tasks = data;
156
+ });
157
+ },
158
+ data: {
159
+ newTask: {
160
+ finished: false,
161
+ name: ''
162
+ },
163
+ tasks: [] // 初期値として空を定義
164
+ },
165
+ methods: {
166
+ newTask_submit: function(event) {
167
+ this.tasks.unshift(this.newTask);
168
+ this.newTask = {
169
+ finished: false,
170
+ name: ''
171
+ };
172
+ },
173
+
174
+ delete_click: function(event) {
175
+ this.tasks = this.tasks.filter(v => !v.finished);
176
+ },
177
+ },
178
+ });
179
+
71
180
  ```

1

一段階目を加筆

2017/02/10 04:44

投稿

yamato_hikawa
yamato_hikawa

スコア2092

answer CHANGED
@@ -18,4 +18,54 @@
18
18
  });
19
19
 
20
20
  console.log(nameList); // ["test1", "test2", "test3"]
21
+ ```
22
+
23
+ # 段階的に考える
24
+ まずこれで動くことを確認します。
25
+ この形だと、`json_data_finished_name`の値を上手く取得できさえすれば、動く形になっています。
26
+
27
+ ## 第一段階
28
+
29
+ ```javascript
30
+ var json_data_finished_name = [{
31
+ finished: false,
32
+ name: 'test1'
33
+ }, {
34
+ finished: false,
35
+ name: 'test2'
36
+ }, {
37
+ finished: false,
38
+ name: 'test3'
39
+ }, ];
40
+
41
+ window.app = new Vue({
42
+ el: '#app',
43
+ components: {
44
+ 'form_component': FormComponent,
45
+ 'item_component': ItemComponent,
46
+ },
47
+ created: function() {
48
+
49
+ },
50
+ data: {
51
+ newTask: {
52
+ finished: false,
53
+ name: ''
54
+ },
55
+ tasks: json_data_finished_name
56
+ },
57
+ methods: {
58
+ newTask_submit: function(event) {
59
+ this.tasks.unshift(this.newTask);
60
+ this.newTask = {
61
+ finished: false,
62
+ name: ''
63
+ };
64
+ },
65
+
66
+ delete_click: function(event) {
67
+ this.tasks = this.tasks.filter(v => !v.finished);
68
+ },
69
+ },
70
+ });
21
71
  ```