Vueにおいて、クリックアクションで現在の位置情報を取得して文字列としてStoreに格納するコードを記述しました。しかし、非同期に処理が走っているため、dispatcher内に送られる引数がundefinedとなってしまいます。参考までに即時関数の記述のままでこの問題を解決する記述方法がありますでしょうか?アドバイスをいただきたく思います。
また、そもそもVueではこのような記述をしないほうがよろしいのでしょうか?
(例えば、現在地を取得してStateとして持ったCurrentPosition.vueを別コンポーネントとして作成し、クリックアクションによりこのコンポーネントを生成する書き方にしたほうがいいかとも思いましたがどうなのでしょうか?)
以下コードです。
javascript
1<template> 2 <div class='InputCurrentPosition'> 3 <v-layout row wrap> 4 <v-form ref='form' v-on:submit.prevent='addpos()'> 5 <v-btn v-on:click.prevent='addpos()' color='success' dark>Submit</v-btn> 6 </v-form> 7 </v-layout> 8 </div> 9</template> 10 11<script> 12export default { 13 name: 'InputCurrentPosition', 14 data () { 15 return { 16 } 17 }, 18 methods: { 19 addpos: function () { 20 let pos = {} 21 if (navigator.geolocation) { 22 pos = navigator.geolocation.getCurrentPosition( 23 function (position) { 24 let coords = position.coords 25 let latitude = coords.latitude 26 let longitude = coords.longitude 27 let pos = {lat: latitude, lng: longitude} 28 console.log(pos) 29 return pos 30 }, 31 function (error) { 32 alert('Error') 33 print(error) 34 } 35 ) 36 } else { 37 // error handling 38 } 39 this.$store.dispatch('PosAdd', String(pos)) 40 } 41 } 42} 43</script> 44 45<!-- Add "scoped" attribute to limit CSS to this component only --> 46<style scoped> 47.input{ 48 width: 130pt; 49 height:30pt; 50} 51.button { 52 display: block; 53 position: relative; 54 margin: 0 auto; 55 width: 70pt; 56 border: solid 1px silver; 57 border-radius: 0.5rem 0.5rem; 58 padding: 0.5rem 1.5rem; 59 margin-top: 1rem; 60 text-decoration: none; 61} 62</style>
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。