質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Q&A

0回答

907閲覧

Vueのモーダルウィンドウでキャンセル時に値が更新されてしまうのを防ぎたい

gunners6518

総合スコア16

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

0グッド

0クリップ

投稿2020/05/14 08:07

#実現したい事

vueの編集モーダルにてキャンセルを押しても値の変更が行われてしまうのを防ぎたい。
リロードした際は変更が行われていないので、保存はされていないと思われる。

修正箇所に心当たりある方はアドバイスいただけると幸いです。

index.vue

1<template> 2 3~他の部分は省略~ 4 5 <Modal v-if="editModal" :headerTitle="'媒体'+this.titleName" @close="editModal=false" @footer-action="updateMedias" :footer-btn-disabled="doubleProcessGuard" footer-btn-text="保存"> 6 <div class="edit-modal-inner"> 7 <table-component> 8 <thead> 9 <table-row> 10 <table-head-cell v-for="(v,i) in this.itemHead" :key="i">{{v}}</table-head-cell> 11 </table-row> 12 </thead> 13 <tbody> 14 <table-row v-for="(media,i) in updateInput" :key="media.id"> 15 <table-cell> 16 <input-component v-model="media.name"/> 17 </table-cell> 18 </table-row> 19 </tbody> 20 </table-component> 21 </div> 22 </Modal> 23 24 </div> 25 </div> 26</template> 27<script> 28import PlusCircle01Icon from "../../../../images/icons/plus_circle01.svg"; 29import EditIcon from "../../../../images/icons/edit01.svg"; 30import Modal from "../../lv2/Modal"; 31 32export default { 33 components: { 34 Modal 35 }, 36 props: ['mediaRouteJson'], 37 data() { 38 return { 39 PlusCircle01Icon, 40 EditIcon, 41 42 mediaRoute: JSON.parse(this.mediaRouteJson), 43 doubleProcessGuard: false, 44 isButtonDisabled: false, 45 itemHead: ['媒体名'], 46 addLimit: 30, 47 addModal: false, 48 editModal: false, 49 medias: {}, 50 updateInput: {}, 51 addInput: {'name':''}, 52 titleName: '', 53 loading: false 54 } 55 }, 56 mounted() { 57 this.getMedias(); 58 }, 59 methods: { 60 async getMedias() { 61 this.loading = true; 62 let result = await axios.get(this.mediaRoute['setting.media.list'].url) 63 .catch(error => { 64 console.error(error) 65 alert('情報が取得出来ませんでした。') 66 }).finally(()=>this.loading = false) 67 this.medias = Object.values({...result.data.data}) 68 69 //最大件数以上登録できない様登録ボタンを無効化 70 if(this.medias.length >= this.addLimit) this.isButtonDisabled = true; 71 }, 72 openEditModal() { 73 this.titleName = '編集' 74 this.updateInput = this.medias; 75 this.editModal = true; 76 }, 77 async storeMedias() { 78 this.doubleProcessGuard = true 79 const result = await axios.post(this.mediaRoute['setting.media.store'].url, this.addInput) 80 .catch(error => { 81 console.error(error) 82 alert(this.titleName+'出来ませんでした。') 83 }) 84 85 let message = this.getErrorMessage(result) 86 if(!message) { 87 this.getMedias();// medias再取得セット 88 this.addModal = false 89 message = this.titleName+'しました。' 90 } 91 // alert message 92 alert(message) 93 this.doubleProcessGuard = false 94 }, 95 async updateMedias() { 96 this.doubleProcessGuard = true 97 98 // データ整形 99 const param = [] 100 for(let k of Object.keys(this.updateInput)) { 101 param.push({ 102 'id': this.updateInput[k].id, 103 'name': this.updateInput[k].name 104 }) 105 } 106 107 // 更新データ送信処理 108 const result = await axios.post(this.mediaRoute['setting.media.update'].url, param) 109 .catch(error => { 110 console.error(error) 111 alert(this.titleName+'出来ませんでした。') 112 }) 113 114 let message = this.getErrorMessage(result) 115 if(!message) { 116 this.getMedias();// medias再取得セット 117 this.editModal = false 118 message = this.titleName+'しました。' 119 } 120 // alert message 121 alert(message) 122 this.doubleProcessGuard = false 123 }, 124 125 } 126} 127console.log(media.name); 128</script> 129 130~省略~ 131 132

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問