Как снять отметку с ответа на вопрос в дочернем vue от родителя

Мое приложение похоже на викторину. на каждый вопрос могут быть включены ответы с переключателями, целые числа, текст и т. д. Рассмотрим случай вопроса с несколькими вариантами ответов. У меня есть привязанность к параметрам переключателя. в родительском Vue у меня есть кнопка сброса для каждого вопроса. Если я нажму на сброс, он должен удалить выбранный ответ для этого конкретного вопроса.

Как я могу добиться этого, учитывая, что кнопка сброса находится в родительском vue, а ответ, который нужно сбросить, находится в дочернем Vue?

Родитель:

<template>
  <div class = "inputContent">
    <p class = "lead" v-if = "title">
       {{title}}
    <span v-if = "valueConstraints.requiredValue" class = "text-danger">* . 
    </span>
   </p>
  <b-alert variant = "danger" show v-else>
      This item does not have a title defined
  </b-alert>

  <!-- If type is radio -->
  <div v-if = "inputType==='radio'">
    <Radio :constraints = "valueConstraints" :init = "init" 
           :index = "index" v-on:valueChanged = "sendData" />
  </div>

  <!-- If type is text -->
  <div v-else-if = "inputType==='text'">
    <TextInput :constraints = "valueConstraints" :init = "init" v- 
        on:valueChanged = "sendData"/>
  </div>

  <div class = "row float-right">
    <b-button class = "" variant = "default" type=reset @click = "reset">
    Reset1
    </b-button>
    <b-button class = "" variant = "default" v- 
       if = "!valueConstraints.requiredValue" @click = "skip">
    Skip
    </b-button>
  </div>

</div>
</template>

<style></style>

<script>
import { bus } from '../main';
import Radio from './Inputs/Radio';
import TextInput from './Inputs/TextInput';

export default {
   name: 'InputSelector',
   props: ['inputType', 'title', 'index', 'valueConstraints', 
        'init'],
   components: {
       Radio,
       TextInput,
   },
  data() {
      return {
      };
  },
  methods: {
      skip() {
         this.$emit('skip');
      },
      // this emits an event on the bus with optional 'data' param
      reset() {
         bus.$emit('resetChild', this.index);
         this.$emit('dontKnow');
      },
      sendData(val) {
         this.$emit('valueChanged', val);
         this.$emit('next');
      },
  },
};
</script>

ребенок вью:

<template>
  <div class = "radioInput container ml-3 pl-3">
    <div v-if = "constraints.multipleChoice">
      <b-alert show variant = "warning">
        Multiple Choice radio buttons are not implemented yet!
      </b-alert>
    </div>
    <div v-else>
      <b-form-group label = "">
        <b-form-radio-group v-model = "selected"
                            :options = "options"
                            v-bind:name = "'q' + index"
                            stacked
                            class = "text-left"
                            @change = "sendData"
        >
        </b-form-radio-group>
      </b-form-group>
    </div>
  </div>
</template>

<style scoped>
</style>

<script>
import _ from 'lodash';
import { bus } from '../../main';

export default {
  name: 'radioInput',
  props: ['constraints', 'init', 'index'],
  data() {
    return {
      selected: null,
    };
  },
  computed: {
    options() {
      return _.map(this.constraints['itemListElement'][0]['@list'], (v) => {
        const activeValueChoices = _.filter(v['name'], ac => ac['@language'] === "en");
        return {
          text: activeValueChoices[0]['@value'],
          value: v['value'][0]['@value'],
        };
      });
    },
  },
  watch: {
    init: {
      handler() {
        if (this.init) {
          this.selected = this.init.value;
        } else {
          this.selected = false;
        }
      },
      deep: true,
    },
  },
  mounted() {
    if (this.init) {
      this.selected = this.init.value;
    }
    bus.$on('resetChild', this.resetChildMethod);
  },
  methods: {
    sendData(val) {
      this.$emit('valueChanged', val);
    },
    resetChildMethod(selectedIndex) {
      this.selected = false;
    },
  },
};
</script>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
209
1

Ответы 1

Один из способов - использовать шину событий

в вашем основном js добавьте:

//set up bus for communication
export const bus = new Vue();

в вашем родительском vue:

import {bus} from 'pathto/main.js';

// in your 'reset()' method add:
// this emits an event on the bus with optional 'data' param
bus.$emit('resetChild', data);

в твоем ребенке

import {bus} from 'path/to/main';

// listen for the event on the bus and run your method
mounted(){
    bus.$on('resetChild', this.resetChildMethod());
},
methods: {
  resetChildMethod(){
    //put your reset logic here
  }
}

он выдает следующую ошибку: Ошибка в обработчике событий для "resetChild": "TypeError: Невозможно прочитать свойство 'apply' of undefined". Что это обозначает?

Ann 18.12.2018 21:07

Вам нужно будет добавить свой код к вашему вопросу, чтобы мы его увидели

ryeMoss 18.12.2018 21:13

этой ошибки почему-то больше нет. Я отредактировал свой вопрос. не могли бы вы помочь мне сбросить выбранное значение? если я делаю this.selected=false, он сбрасывает все выбранные значения вопросов в пользовательском интерфейсе. как снять отметку только с текущего вопроса?

Ann 19.12.2018 12:41

один из способов - присвоить каждой из ваших кнопок уникальный индекс опора. затем при emit также передайте индекс, а затем проверьте полученный индекс на свойство this.index дочернего элемента

ryeMoss 19.12.2018 14:54

Другие вопросы по теме