У меня есть список флажков, который в верхней части имеет флажок Select All
. Он приводится в движение observable array
строк. Когда пользователь проверяет Select All
, он должен, как говорится check
все флажки, и при последующем щелчке он должен отменить выбор всех. Довольно прямо вперед.
Некоторые подробности о состоянии и т. Д .:
let arrayB = ['a','b','c'] // List coming from an API etc
let state = observable({
arrayA: [], // <-- nothing is checked by default
get hasAllChecked() {
return ( state.arrayA.length === arrayB.length )
},
})
Проблема в том, что мне интересно узнать, есть ли в этом обработчике список флажков onChange
:
if (!state.hasAllChecked) {
removeChildren()
} else {
removeChildren()
addAllChildren()
}
На первый взгляд, вы спросите, почему бы не изменить этот код на:
removeChildren()
if (!state.hasAllChecked)
addAllChildren()
Вот почему и шаги для иллюстрации:
- Флажок снят и ничего не проверено. Вы нажимаете, и все поля не отмечены.
- Пока все отлично. Теперь пользователь снова нажимает на флажок
Deselect All
(то же самое поле, только метка изменяется в зависимости от значения hasAllChecked
)
- Так как у нас нет
if
, теперь мы идем вперед и remove
все предметы
- За кулисами MobX обновляет наблюдаемое, и теперь оно составляет
false
, поскольку два массива равны NOT
, равным
- Теперь мы добавляем все элементы и все флажки отмечены.
Конечный результат - ничего не выбрано, так как мы удалили все, а затем добавили все. Отсюда необходимость в этом else
.
Есть ли способ изменить это, не выполняя else
и не имея removeChildren()
в коде дважды? Обратите внимание, что я хочу избежать вычисления массива difference
и добавлять / удалять необходимые / отсутствующие элементы.
Наличие там почти требует комментария рядом с ним с объяснением и т. Д. Я, вероятно, упускаю что-то простое или фундаментальное в mobX и т. Д.