да. js Проверить числовое поле больше, чем у родного брата, или допускает значение NULL - PullRequest
0 голосов
/ 07 мая 2020

Я использую Yup. js для проверки некоторых полей формы.

У меня есть два целочисленных поля, Year Built и Year Renovated.

Year Built является обязательным полем, Year Renovated - нет.

Год ремонта можно оставить пустым, однако , если есть значение , оно должно быть больше, чем год постройки (ремонт обязательно должен произойти после даты постройки).

Я считаю, что мне нужно использовать функцию ref(), а также функцию when(). Я пробовал следующее:

let currentYear = new Date (). GetFullYear ();

yup.object().shape({
  yearBuilt     : yup.number().integer().min(1700).max(currentYear+1).required(),
  yearRenovated : yup.number().integer().when(
                    '$yearRenovated', (yearRenovated, schema)=>{
                        return yearRenovated > 0 ? 
                            schema.min(yup.ref('yearBuilt')).max(currentYear+1) :
                            schema.transform(emptyStringToNull).nullable()
                    }
                )
})

* Функция преобразования emptyStringToNull просто проверяет наличие value === '' и возвращает null, если это так.

Вышеупомянутое действительно допускает нулевые значения, а также правильно проверяет целое число. Однако он неправильно оценивает yearRenovated > yearBuilt. Как мне правильно проверить, что если yearRenovated не равно нулю, то больше, чем yearBuilt?

Большое спасибо за вашу помощь.

1 Ответ

0 голосов
/ 08 мая 2020

@ JQuense, владелец репо имел красноречивое решение, используя moreThan():

const schema = yup.object().shape({
    yearBuilt: yup
      .number()
      .integer()
      .min(1700)
      .max(currentYear+1)
      .required(),
    yearRenovated: yup
      .number()
      .integer()
      .nullable()
      .moreThan(yup.ref("yearBuilt")) //<-- a whole lot neater than using a when conditional...
      .max(currentYear+1)
});

Надеюсь, что это поможет! Спасибо @ JQuense.

...