前提・実現したいこと
現在、下図のようにチェックをいれた明細行の金額を集計する機能を作成しています。
先頭行のチェックボックスにチェックを入れたときに全選択したいのですが、
全選択をできるようにすると下図のように集計が行えなくなります。
全選択の機能とチェック済みの明細の金額を集計する機能を共存したいのですが、うまく行えません。
発生している問題・エラーメッセージ
ソースコード上でコメントアウトしていますが、
チェックボックスのv-modelが上手にできていないため、
機能が両方動かすことができていないのものと思います。
該当のソースコード
javascript
1<!DOCTYPE html> 2<html lang='ja'> 3<head> 4 <meta charset='UTF-8'> 5 <title>sample1</title> 6</head> 7<body> 8<div id='app'> 9 <div> 10 <h1>sample</h1> 11 <table class='table'> 12 <thead> 13 <tr> 14 <th><input type='checkbox' v-model="details.isAllSelected" @click="selectAll"></input></th> 15 <th>商品名</th> 16 <th>単価</th> 17 <th>数量</th> 18 <th>消費税率</th> 19 <th>税抜金額計</th> 20 <th>消費税額</th> 21 <th>合計金額</th> 22 </tr> 23 </thead> 24 <tbody> 25 <tr v-for='(detail,index) in details' v-bind:key='detail.id'> 26 <!-- detail.isChecked → details.isCheckedで全選択できるようになるが、computedのチェック済みのみを計算する機能が働かなくなる 27 <th><input type='checkbox' v-model='detail.isChecked'></input></th> 28 --> 29 <th><input type='checkbox' v-model='details.isChecked'></input></th> 30 <th><input type='text'></th> 31 <th><input type='number' v-model.number='detail.unitPrice' style="text-align:right"></th> 32 <th><input type='number' v-model.number='detail.num' style="text-align:right" ></th> 33 <th><input type='number' v-model.number='detail.rate' style="text-align:right"></th> 34 <th>{{ (detail.unitPrice * detail.num).toLocaleString()}} </th> 35 <th>{{ (detail.unitPrice * detail.num * detail.rate/100).toLocaleString()}} </th> 36 <th>{{ ((detail.unitPrice * detail.num ) + (detail.unitPrice * detail.num * detail.rate/100)).toLocaleString() }} </th> 37 <th><button @click='deleteRow(index)'>削除</button></th> 38 </tr> 39 </tbody> 40 </table> 41 <button @click='addRow'>行を追加</button> 42 <p>税抜金額計{{ totalPrice.toLocaleString() }}円</p> 43 <p>消費税額計{{ totalTax.toLocaleString() }}円</p> 44 <p>税込金額計{{ totalPriceWithTax.toLocaleString() }}円</p> 45 </div> 46</div> 47<script src='https://unpkg.com/vue'></script> 48</body> 49 50<script> 51 let app = new Vue({ 52 el: '#app', 53 data() { 54 return{ 55 details:[{ 56 isAllSelected:false, 57 isChecked:'', 58 unitPrice:'', 59 num:'', 60 rate:10 61 }] 62 } 63 }, 64 computed:{ 65 //税抜金額計 66 totalPrice:function(){ 67 return this.details.filter(x => x.isChecked).reduce((sum, detail) => sum + detail.unitPrice * detail.num, 0); 68 }, 69 //消費税計 70 totalTax:function(){ 71 return this.details.filter(x => x.isChecked).reduce((sum, detail) => sum + detail.unitPrice * detail.num * detail.rate/100, 0); 72 }, 73 //税込額計 74 totalPriceWithTax:function(){ 75 return this.details.filter(x => x.isChecked).reduce((sum, detail) => sum + (detail.unitPrice * detail.num ) + (detail.unitPrice * detail.num * detail.rate/100), 0); 76 } 77 }, 78 methods:{ 79 //全選択 80 selectAll () { 81 if (this.details.isAllSelected) { 82 this.details.isChecked = false 83 } 84 else { 85 this.details.isChecked = true 86 } 87 }, 88 //行追加 89 addRow:function(){ 90 this.details.push({ 91 unitPrice:'', 92 num:'', 93 rate:10 94 }) 95 }, 96 //行削除 97 deleteRow:function(index){ 98 this.details.splice(index,1) 99 } 100 } 101}) 102</script> 103 104<style> 105.table { 106 border: 1px solid #eee; 107 border-collapse: collapse; 108} 109.table th, 110.table td { 111 border: 1px solid #dedede; 112 padding: .5em; 113 text-align: center; 114} 115 116</style> 117</html>
補足情報(FW/ツールのバージョンなど)
Vueのバージョンは2.6.14を使用しています。
回答2件
あなたの回答
tips
プレビュー