2017-01-16 2 views
1

Я создаю структуру формы в vue. У меня есть компоненты для каждого типа поля. Каждый компонент типа поля использует это. $ Emit для обмена изменениями с родительским компонентом.Как поймать события на нескольких дочерних компонентах Vue

Я могу вызвать события в родительском компоненте, используя V-на директивы следующим образом:

<template> 
<div v-if="fieldsLoaded"> 
    <form-select :field="fields.title" v-on:updated="validate" ></form-select> 
    <form-input :field="fields.first_name" v-on:updated="validate" ></form-input> 
</div> 
</template> 

Однако, я не хочу, чтобы вручную указать, что каждый компонент должен вызывать метод validate индивидуально ,

Как я могу заставить родительский компонент прослушивать updated на всех его дочерних компонентах?

Редактировать: Я ищу что-то вроде ниже, хотя $ на только улавливает излучает, которые происходят в пределах одного компонента, а не своих детей

created: function(){ 
    this.$on('updated',validate) 
} 

ответ

0

В вашем случае вы можете использовать v- модель, как следующее:

<template> 
<div v-if="fieldsLoaded"> 
    <form-select v-model="fields.title" :validate="validate" ></form-select> 
    <form-input v-model="fields.first_name" :validate="validate" ></form-input> 
</div> 
</template> 

v-model является по существу синтаксисом для обновления данных о введенных пользователем событий.

<input v-model="something"> 

это просто синтаксический сахар для:

<input v-bind:value="something" v-on:input="something = $event.target.value"> 

Вы можете пройти пропеллер: value в дочерних компонентов, а также перед изменением поля ввода вызова функции для проверки, которая также передается в качестве опоры.

Vue.component('form-select', { 
    props: ['options', 'value', 'onChange', 'validate'], //Added one more prop 
    template: '#your-template', 
    mounted: function() { 
    }, 
    methods: { 
    change (opt) { 
     if (this.validate !== undefined) { 
     var isValid = this.validate(this.value) 
     if(!isValid) return; 
     } 
     this.$emit('input', opt) 
    }, 
    }, 
}) 
+0

Вы ссылаетесь на this.validate(), но это не требует определения метода проверки в этом дочернем компоненте? Мое намерение состояло в том, что я бы сохранил логику проверки в родительском компоненте, чтобы он мог делиться между различными дочерними компонентами. – rhoward

+0

Извините, я просто понял вашу мысль - вы говорите, что я могу передать метод проверки из родителя. Я думаю, это сработает, но это не уменьшит мой код. Я уже работал, как в моем исходном примере, где я явно запускаю метод validate в родительском для каждого поля. То, к чему я стремлюсь, является чем-то общим, которое ловит * все * выбросы валидации от своих детей, не требуя явного поля в полевых условиях. – rhoward

+0

@ rhoward По моему подходу вы можете перемещать код шоу, связанный с сообщением об ошибке и т. Д. Внутри этих компонентов. Что касается вашей точки, связанной с повторным использованием кода, вы можете посмотреть на [mixins] (https://vuejs.org/v2/guide/mixins.html#ad), где вы можете попробовать установить общую функциональность и повторно использовать ее в компонентах. – Saurabh

Смежные вопросы