Динамическое связывание блока выбора данных на vuejs - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть вопросы по поводу привязки данных в vuejs, и я надеюсь, что все здесь могут помочь мне решить эту проблему.
Я нахожусь в стадии обучения использованию vuejs с laravel. У меня проблемы с привязкой данных в процессе редактирования данных, я не могу отобразить какую-либо информацию в поле выбора. Затем я включаю ответ данных, который я хочу отобразить, и код.

ответ данных

{
  "data":{
    "id":101,
    "kode":"B100",
    "nama":"Bendung Jules Rutherford",
    "desa":{
      "id":"5103050018",
      "district_id":"5103050",
      "name":"BONGKASA PERTIWI",
      "district":{
        "id":"5103050",
        "city_id":"5103",
        "name":"ABIANSEMAL",
        "city":{
          "id":"5103",
          "province_id":"51",
          "name":"KABUPATEN BADUNG",
          "province":{
            "id":"51",
            "name":"BALI",
          }
        }
      }
    }
  }
}

, и это код :

<template>
    <div>
        <div v-if="!loading">
            <div class="form-group row">
                <label class="col-sm-3">Kode</label>
                <div class="col-sm-9">
                    <input :class="{'is_invalid' : errors.kode}" v-model="bendung.kode" type="text" class="form-control" placeholder="B0001">
                    <div class="invalid-feedback" v-if="errors.kode">{{ errors.kode[0] }}</div>
                </div>
            </div>
            <div class="form-group row">
                <label class="col-sm-3">Nama</label>
                <div class="col-sm-9">
                    <input :class="{'is-invalid': errors.nama}" v-model="bendung.nama" type="text" class="form-control" placeholder="Bendungan Mengwi">
                    <div class="invalid-feedback" v-if="errors.nama">{{ errors.nama[0] }}</div>
                </div>
            </div>
            <div :class="['form-group row', {'has-error' : errors.provinces }]">
                <label class="col-sm-3">Provinsi</label>
                <div class="col-sm-9">
                    <select @change="province" v-model="bendung.desa.district.city.province_id" class="form-control">
                        <option value="">Pilih Provinsi</option>
                        <option v-for="province in provinces" :value="province.id">
                            {{ province.name }}
                        </option>
                    </select>
                </div>
            </div>
            <div :class="['form-group row', {'has-error' : errors.cities }]">
                <label class="col-sm-3">Kota / Kabupaten</label>
                <div class="col-sm-9">
                    <select @change="city" v-model="bendung.desa.district.city_id" class="form-control">
                        <option value="">Pilih Kota/Kabupaten</option>
                        <option v-for="city in cities" :value="city.id">
                            {{ city.name }}
                        </option>
                    </select>
                </div>
            </div>
        </div>
        <div class="row" v-else>
            <div class="col-sm-12">
                <content-placeholders>
                    <content-placeholders-text/>
                </content-placeholders>
            </div>
        </div>
        <div class="form-group row">
            <div class="col-sm-3"></div>
            <div class="col-sm-9">
                <a class="btn btn-success" href="#" :disabled="submiting" @click.prevent="update">
                    <font-awesome-icon :icon="['fas', 'spinner']" v-if="submiting" />
                    <font-awesome-icon :icon="['fas', 'check']" v-else/>
                    <span class="ml-1">Perbaharui</span>
                </a>
                <a href="/sda/bendung" class="btn btn-danger">
                    <font-awesome-icon :icon="['fas', 'times-circle']" /> Batal</a>
            </div>
        </div>
    </div>
</template>

<script>
    export default {
        data() {
            return {
                errors: {},
                bendung: {},
                provinces: [],
                cities:[],
                districts: [],
                state: {
                  province: '',
                  city: '',
                  district: '',
                },
                loading: true,
                submiting: false
            }
        },

        mounted() {
            this.getBendung();
            this.getProvinces();
        },

        methods: {
            getBendung() {
                this.loading = true;
                let str = window.location.pathname;
                let res = str.split("/");
                axios.get(`${process.env.MIX_WEBSERVICE_URL}/sda/bendung/${res[3]}`)
                    .then(response => {
                        this.bendung = response.data.data;
                        this.state.province = this.bendung.desa.district.city.province_id;
                    })
                    .catch(error => {
                        this.$toasted.global.error('Bendung tidak ditemukan!');
                        location.href = '/sda/bendung';
                    })
                    .then(() => {
                        this.loading = false;
                    });
            },

            getProvinces() {
                axios.get(`${process.env.MIX_WEBSERVICE_URL}/location/province`).then(response => {
                    this.provinces = response.data;
                }).catch(error => console.error(error));
            },
            province() {
                this.state.city = '';
                const params = {
                    province: this.state.province
                }
                axios.get(`${process.env.MIX_WEBSERVICE_URL}/location/city`, {params}).then(response => {
                    this.cities = response.data;
                }).catch(error => console.error(error));
            },

            city() {
                this.state.district = '';
                const params = {
                    city: this.state.city
                };
                // /location/district?city=cityId
                axios.get(`${process.env.MIX_WEBSERVICE_URL}/location/district`, {params}).then(response => {
                    this.districts = response.data;
                }).catch(error => console.error(error));
            }
        }
    }
</script>

<style scoped>

</style>

результат похож на эту картинку. enter image description here Я хочу показать название города в поле выбора, но я получил пустое поле выбора, и когда я изменяю поле выбора (например, провинция / провинция), другой блок выбора (например, kabupaten / kota / city) изменит егоданные.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

Вы пытались использовать опору v-bind:key в петле v-for?

v-bind:key="city.id"

или лучше с дополнительным индексом:

v-for="(city, index) in cities"
[...]
v-bind:key="`${index}-${city.id}`"
0 голосов
/ 01 ноября 2019

Вы можете получить новые данные, когда предыдущие данные были изменены.

Вот рабочий пример: https://codesandbox.io/embed/vue-template-2zv2o

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...