<div class="v-area-selector" ref="vAreaSelector">
<transition name="fade">
<article class="js-area-selector-pref" v-show="opened && !selectedArea">
<div class="responsive-container">
<header>
<div class="header_wr">
<div class="title_wr">
<a href="#" class="back" @click.stop="close"></a>
<h1 class="header_title">都道府県を選択する</h1>
</div>
</div>
</header>
<main>
<ul class="area_list">
{# <li class="location"><a href="#"><span class="icon">現在の位置から探す</span></a></li>#}
<li v-for="area in areas"><a href="#" @click.stop="selectArea(area)">[[ area.name ]]</a></li>
</ul>
</main>
</div>
</article>
</transition>
{# --------------- 市区町村 --------------- #}
<article class="js-area-selector-city" v-show="opened && selectedArea">
<div class="responsive-container">
<header>
<div class="header_wr">
<div class="title_wr">
<a href="#" class="back" @click="backToArea"></a>
<h1 class="header_title">市区町村を選択する</h1>
</div>
</div>
</header>
<main>
<ul class="area_list" v-if="selectedArea">
<li v-for="location in selectedArea.locations"><a href="#" @click.stop="selectLocation(location)">[[ location.name ]]</a></li>
</ul>
</main>
</div>
</article>
</div>
<script>
$(function () {
var vAreaSelector = new Vue({
el: '.v-area-selector',
delimiters: ['[[', ']]'],
data: function () {
return {
{# // trueならエリア選択画面を表示 #}
opened: false,
{# // 選択可能なarea、location #}
areas: [],
{# // 選択したarea #}
selectedArea: null,
{# // 選択したlocation #}
selectedLocation: null,
{# // location選択後に実行されるcallback #}
callback: null,
};
},
created: function () {
this.refreshArea();
},
computed: {
{# // 選択エリア内のlocationを返す #}
selectedAreaLocations: function () {
if (this.selectedArea) {
return this.selectedArea.locations;
}
return [];
},
},
methods: {
open: function (callback) {
this.opened = true;
this.callback = callback;
},
close: function () {
this.opened = false;
},
refreshArea: function () {
var self = this;
$.ajax({
url: '{{ path('api_areas_get_collection') }}',
headers: {
'Accept': 'application/json',
},
}).done(function (data) {
self.areas = data;
}).fail(function () {
alert('エリアの取得に失敗しました。ページを再読み込みしてください。');
});
},
selectArea: function (area) {
this.selectedArea = area;
},
selectLocation: function (location) {
this.selectedLocation = location;
if (typeof this.callback === 'object' || typeof this.callback === 'function') {
this.callback(this.selectedLocation);
}
this.close();
},
backToArea: function () {
this.selectedArea = null;
},
},
});
$(document).on('click', '.js-area-selector', function () {
var self = this;
{# // .js-area-selectorをクリックするとエリア選択画面を表示 #}
vAreaSelector.open(function (location) {
{# // 呼び出し元の要素にはlocationの名称を日本語で入れる #}
$(self).val(location.name);
{# // 選択したlocationのIDを入れる対象の要素をdata属性から取得したセレクタで取得 #}
var target = $(self).data('area-selector-data-target');
var $target = $(target);
{# // 選択したlocationのIDを値として入れる #}
$target.val(location.id);
});
});
});
</script>