Как создать поле перекрестной проверки с помощью vee-validate? - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь использовать vee-validate для проверки 3 полей (текстовых полей) на основе выбора другого поля (выберите), но я не могу понять, как я могу это сделать.

По сути, у меня есть поле выбора с 5 значениями, если выбранное значение равно 1 или 2, остальные 3 поля в форме являются обязательными.

Вот пример

vee-validate Если я выберу «Ausente» (значение 1) или «A desenvolver» (значение 2), остальные 3 поля обязательны для заполнения.

Вот код, который я придумал

<v-col cols="2">
    <validation-provider
        rules="required"
        v-slot="{ errors }"
        name="skillLevel"
    >  <!-- If this select has value of 1 or 2 -->
        <v-select
            v-model="answers[n-1][index].skillLevel"
            outlined
            :error-messages="errors"
            :items="selectLevels"
            label="Selecione"
            item-text="level"
            item-value="value"
        ></v-select>
    </validation-provider>
</v-col>

<!-- These 3 fields must be required -->
<v-col cols="2">
    <validation-provider
        name="feedback"
        rules="required||isRequiredWith:@skillLevel"
    >
        <v-textarea v-model="answers[n-1][index].feedBack" outlined rows="3"></v-textarea>
    </validation-provider>
</v-col>

<v-col cols="2">
    <validation-provider name="selfAppraisal" rules="required">
        <v-textarea
            v-model="answers[n-1][index].selfAppraisal"
            outlined
            rows="3"
        ></v-textarea>
    </validation-provider>
</v-col>

<v-col cols="3">
    <validation-provider name="feedforward" rules="required">
        <v-textarea v-model="answers[n-1][index].feedForward" outlined rows="3"></v-textarea>
    </validation-provider>
</v-col>

Вот мой js

import { required} from "vee-validate/dist/rules";
import {
  extend,
  ValidationObserver,
  ValidationProvider,
  setInteractionMode
} from "vee-validate";

setInteractionMode("eager");

extend("required", {
  ...required,
  message: "Campo não pode ficar em branco"
});

extend("isRequiredWith", {
  params: ["target"],
  validate(value, { target }) {
    if (target === 1 || target === 2) {
      console.log(target);
      //Problem is here, i'm messing up the value/target, don't what i need to check
      console.log("cannot be empty");
    }
  },
  message: "Required"
});

1 Ответ

1 голос
/ 09 марта 2020

Я не уверен, что происходит не так, похоже, ваш код в основном должен работать. Хотя я попробовал, и он никогда не утруждает себя проверкой isRequiredWith при изменении целевого значения. Итак, вот альтернативный способ, который не требует создания собственного правила:

<validation-provider
    name="feedback"
    :rules="{required:(answers[n-1][index].skillLevel == 1 || answers[n-1][index].skillLevel == 2)}"
>
    <v-textarea v-model="answers[n-1][index].feedBack" outlined rows="3"></v-textarea>
</validation-provider>

Это не красиво, но работает. См. Упрощенный пример здесь: https://codesandbox.io/s/veevalidate-30-cross-field-validation-gpkj9

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