@JummyBot

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

Как правильно пересчитывать максимальное значение для каждого инпута? Например, у меня сумма значений всех инпутов не может быть больше 80 (сколько нужно доставить), инпутов может быть больше одного, при этом изначально максимальное значение стремится к 40 (максимальная загрузка авто). Соответственно, когда допустим из БД приходит два трипа на 40 и 20, я могу либо добавить еще один трип/инпут на 20 или ко второму прибавить 20, чтобы в сумме получилось 80 для всех инпутов. Но сейчас я не очень понимаю, как посчитать эти лимиты конкретно, неверно работает кейс else, где устанавливается значение this.vehicleMaxRoominess. Этот метод вызывается при изменении любого из инпутов и должен корректно просчитывать ограничения.

prepareTripLimits() {
                let availableAmount = !!this.orderForm.order
                    ? this.orderForm.order.amount - (this.orderForm.order.planned - this.currentPlanSavedAmount)
                    : 0,
                    vehicleRoominess = parseInt(this.orderForm.vehicle.roominess)

                for (let i = 0; i < this.form.trips.length; i++) {
                    if (this.form.trips[i].status > TRIP_STATUS_LOADING) {
                        this.form.trips[i].limit = this.form.trips[i].plan_amount
                    } else {
                        this.form.trips[i].limit = availableAmount - vehicleRoominess >= 1
                            ? vehicleRoominess
                            : this.vehicleMaxRoominess
                    }
                    availableAmount -= this.form.trips[i].plan_amount
                }
            },
  • Вопрос задан
  • 239 просмотров
Решения вопроса 2
0xD34F
@0xD34F Куратор тега Vue.js
Устанавливаете наблюдение за значениями, находите изменившееся, исправляете его - вычитаете из него разность (если она больше 0) между текущей суммой и максимально допустимой. Примерно так оно может выглядеть.
Ответ написан
Комментировать
@JummyBot Автор вопроса
решил таким образом, при изменении любого из инпутов вызываю метод что выше, из общего числа 80 вычитаю сумму значений всех инпутов минус значение текущего инпута, если остаток больше или равно 40(обьем авто) то беру его, иначе беру остаток вычитания.
prepareTripLimits() {
                let availableAmount = !!this.orderForm.order
                    ? this.orderForm.order.amount - (this.orderForm.order.planned - this.currentPlanSavedAmount)
                    : 0,
                    vehicleRoominess = parseInt(this.orderForm.vehicle.roominess),
                    capacity = 0

                for (let i = 0; i < this.form.trips.length; i++) {
                    if (this.form.trips[i].status > TRIP_STATUS_LOADING) {
                        this.form.trips[i].limit = this.form.trips[i].plan_amount
                    } else {
                        capacity = availableAmount - ((this.unsavedPlanAmount + this.currentPlanAmount) - this.form.trips[i].plan_amount)
                        this.form.trips[i].limit = capacity >= vehicleRoominess ? vehicleRoominess : capacity
                    }
                }
            },
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@shsv382
Прости, не разбирался в твоем "коде", но по факту тебе нужна глобальная переменная, в которой будет текущее состояние - сумма инпутов. Далее на все инпуты навешиваешь обработчик onchange, который коллбэком изменяет эту переменную и проверяет, чтобы она была в диапазоне 0-80
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы