Я использую виртуальный компонент в компактном проекте. Я добавил фильтрацию в список. Моя проблема в том, что функция в моем проекте перестает работать, когда я фильтрую список, я предполагаю, потому что элемент списка еще не находится в домене после фильтрации?
Проект преобразует медицинские единицы из метрических единиц в международные единицы с использованием двух входов. Изменение одного входа автоматически преобразует другой. Перед фильтрацией все работает с преобразованием, но после ввода имени элемента (например, Type Zinc) преобразование входных данных не выполняется в отфильтрованных элементах. Преобразования не происходит. Я рассматривал afterUpdate как вариант, но не знаю, как его реализовать.
--------- Добавлена информация -------------------
Проблема заключается в том, что элементы списка еще не просматриваются. Попробуйте ввести «цинк», а затем изменить входные значения цинка (сбой), а не ввести «Ацетон» (элемент уже виден) и изменить эти входные значения (он работает).
Вот рабочий REPL
Сценарий:
<script>
import VirtualList from './VirtualList.svelte';
import unitsH from './data.js';
let searchTerm = "";
let start;
let end;
$: filteredList = unitsH.filter(item => item.name.toLowerCase().indexOf(searchTerm) !== -1);
function setBothFromSIH(value, i) {
const {factor, siValue} = unitsH[i];
unitsH[i].siValue = +value;
unitsH[i].usValue = +(value / factor).toFixed(2);
}
function setBothFromUSH(value, i) {
const {factor, usValue} = unitsH[i];
unitsH[i].usValue = +value;
unitsH[i].siValue = +(value * factor).toFixed(2);
}
</script>
С упрощенным кодом HTML:
<VirtualList items={filteredList} bind:start bind:end let:item >
<div class="border" style="overflow-x: scroll;"> <div><div>
<div class="name">{item.name}</div>
<span>Specimen: {item.specimen} </span>
<span> Conversion Factor: {item.factor} </span>
</div>
<div>
<label>US Range:{item.conventionalRange} {item.conventionalUnit}</label>
<input name="us{filteredList.indexOf(item)}" value={item.usValue} on:input="{e => setBothFromUSH(e.target.value, filteredList.indexOf(item))}" type=number placeholder=" US">
</div>
<div>
<label>SI Range: {item.siRange} {item.siUnit}</label>
<input name="si{filteredList.indexOf(item)}" value={item.siValue} on:input="{e => setBothFromSIH(e.target.value, filteredList.indexOf(item))}" type=number placeholder="SI">
</div></div> </div>
</VirtualList>
<p>showing items {start}-{end}</p>
Спасибо за любую помощь в работе!