Это связано с поведением атрибута checked
. Согласно MDN документы :
Логический атрибут, указывающий, установлен ли этот флажок по умолчанию (при загрузке страницы). Значение not указывает, установлен ли данный флажок в настоящее время : если состояние флажка изменено, этот атрибут содержимого не отражает изменения. (Обновляется только атрибут HTMLInputElement
IDL *1011*.)
Фактически, в вашем примере проверенное состояние входа не переключается этой строкой:
?checked=${item.isDone}
но с помощью собственного поведения флажка, который также устанавливает свойство checked
в true
. Чтобы доказать это, вы можете попробовать программно снять галочку после нажатия на него:
// This won't have any effect if yourInputElement.checked is true
yourInputElement.removeAttribute('checked');
lit-html, вероятно, повторно использует входной DOM-узел из удаленной строки, чтобы отобразить следующую строку, не создавая новую, таким образом сохраняя свойство selected в true.
Привязка логического атрибута (?
) только устанавливает или удаляет атрибут . Вместо этого следует использовать привязку свойства (.
) для правильного обновления HTMLInputElement
* checked
свойства .
<input type="checkbox"
value=${item.id}
.checked=${item.isDone}
@click=${this.toggleCheck}>