前提・実現したいこと
Djangoでwebアプリを作成しており、template内でVue.jsを使用しています。
axiosでデータを取ってきた後、それに対応したコンポーネントのメソッドを使用したいです。
発生している問題・エラーメッセージ
TypeError: Cannot read property 'isGood' of undefined at VueComponent.isGood (myscript.js:152) at Vue.<anonymous> (myscript.js:178)
該当のソースコード
html
1<div id="article"> 2 {% for article in articles %} 3 4 <article-good ref="{{ article.id }}" data-id="{{ article.id }}" data-count="{{ article.good_count }}"> 5 </article-good> 6 7 {% endfor %} 8</div>
javascript
1var articleGood = { 2 delimiters: ['[[ ', ']]'], 3 data: function () { 4 return { 5 gooded: false, 6 good_count: 0, 7 } 8 }, 9 mounted: function () { 10 var elm = this.$el; 11 var count = elm.getAttribute('data-count'); 12 var id = elm.getAttribute('data-id'); 13 this.good_count = Number(count); 14 }, 15 template: '<div><i :class="heart" @click="changeGood"></i><span>[[ good_count ]]</span></div>', 16 computed: { 17 heart: function () { 18 return { 19 fas: this.gooded, 20 far: !this.gooded, 21 'fa-heart': true, 22 'fa-blue': true 23 } 24 } 25 }, 26 methods: { 27 //goodボタンが押された時の切り替え 28 changeGood: function () { 29 if (this.gooded) { 30 this.good_count -= 1; 31 } else { 32 this.good_count += 1; 33 } 34 this.gooded = !this.gooded; 35 }, 36 //既にgoodされていたときはボタンをオンにする 37 isGood: function () { 38 this.$refs[id].isGood(); //(← 152行目) 39 this.gooded = true; 40 } 41 } 42} 43 44new Vue({ 45 el: '#article', 46 delimiters: ['[[ ', ']]'], 47 components: { 48 'article-good': articleGood, 49 }, 50 mounted: function () { 51 axios.get('/snsapp/gooded_articles/') 52 .then(function (response) { 53 var article_ids = response.data.article_ids; 54 console.log(article_ids); //(1) 55 for (var i = 0; i < article_ids.length; i++) { 56 id = String(article_ids[i]); 57 console.log(id); //(2) 58 console.log(this.$refs); //(3) 59 console.log(this.$refs[id]); //(4) 60 this.$refs[id].isGood(); //(5) (← 178行目) 61 }; 62 console.log(this.gooded_articles); 63 }.bind(this)) 64 .catch(function (error) { 65 console.log(error); 66 }.bind(this)); 67 }, 68});
試したこと
#######consoleの結果
(1) : (2) [1, 3] (2) : 1 (3) : {1: VueComponent, 2: VueComponent, 3: VueComponent, 6: VueComponent, 7: VueComponent, 8: VueComponent, 9: VueComponent} (4) : VueComponent (5) : TypeError: Cannot read property 'isGood' of undefined at VueComponent.isGood (myscript.js:152) at Vue.<anonymous> (myscript.js:178)
Vue.js公式ガイド/特別な問題に対処するを参考にしてref属性を設置して試してみたのですが上手くいきません。
また、公式ガイドを読んでもどのようにメソッド呼び出しているのかいまいちよく分かりません。
”公式ガイド一部抜粋”
methods: {
// 親からインプット要素をフォーカスするために使われる
focus: function () {
this.$refs.input.focus()
}
}
これはfocusメソッドが自分自身を呼び出している?
必要であればDjango側のコードも載せます。
よろしくお願いします。
###補足
お二方の回答でご指摘いただいた箇所を修正したらコンポーネントは呼び出せたようですが、メソッドを使おうとするとエラーが出ます。
エラー内容は上記の通りです。
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/02 06:24
2020/06/02 06:30
2020/06/02 06:51
2020/06/02 06:58
2020/06/02 07:20
2020/06/02 07:37
2020/06/02 08:00