Заставить панель поиска работать в AlpineJS, когда искомые элементы в x-data приходят из x-init
В основном пытаюсь модифицировать динамическую панель поиска, которую можно найти в документации Alpine, но с "элементами" ("bands" в моем случае), приходящими из x-init, который получает JSON. Вне этой строки поиска все нужные данные из этого JSON отображаются, так что не похоже, что сам JSON пуст, но в этой конкретной ситуации x-text даже не перечисляет никаких значений, как будто данные JSON никогда не попадают в массив x-data/"bands"
Вот что у меня сейчас есть, как я уже сказал, это небольшая модификация строки поиска из документации
<div x-data="{
search: '',
bands: [],
get filteredItems() {
return this.bands.filter(
i => i.startsWith(this.search)
)
}
}" x-init="bands = await (await fetch('/bands/')).json()">
<input x-model="search" placeholder="Search...">
<template x-for="band in filteredItems" :key="band">
<p x-text="`${band.name}`"></p>
</template>
</div>
Буду благодарен, если кто-нибудь подскажет мне, чего именно не хватает в этом, казалось бы, простом куске кода.
Похоже, что в представленном вами коде не хватает нескольких ключевых элементов, необходимых для правильной работы строки поиска.
Во-первых, похоже, что вы пытаетесь использовать метод startsWith для массива bands, но похоже, что массив bands - это массив объектов, а не строк. Метод startsWith доступен только для строк, поэтому вам нужно будет настроить условие фильтрации в соответствии со свойствами объектов в массиве bands.
Во-вторых, вы пытаетесь отобразить свойство name каждого объекта группы, но из представленного вами кода не ясно, откуда вы берете свойство name. Убедитесь, что ваши JSON-данные содержат свойство 'name' объекта band.
Последнее: похоже, что вы используете директиву x-init для получения данных JSON, но директива x-init не используется для получения данных. Она используется для инициализации данных и выполнения любых настроек, которые необходимы перед отображением компонента. Вместо этого вы можете использовать метод жизненного цикла mounted() для получения данных, а затем сохранить их в массиве bands.
Вот пример того, как можно изменить ваш код, чтобы он работал:
<div x-data="{
search: '',
bands: []
}" x-init="mounted()">
<input x-model="search" placeholder="Search...">
<template x-for="band in bands" :key="band.id">
<p x-text="band.name"></p>
</template>
</div>
<script>
function mounted() {
fetch('/bands/')
.then(response => response.json())
.then(data => {
this.bands = data.filter(band => band.name.startsWith(this.search))
})
}
</script>
Эта модификация будет получать данные JSON и сохранять их в массиве bands, а затем использовать метод жизненного цикла mounted() для фильтрации данных с помощью поискового ввода и метода startsWith. В результате будут отображены названия объектов band, которые соответствуют введенным данным поиска.
<div x-data="{search: '', bands: [],
get filteredItems() {
return this.bands.filter(i => i.name.toLowerCase().includes(this.search))
}
}" x-init="bands = await (await fetch('/bands/')).json()">
<input x-model="search" placeholder="Search...">
<template x-for="band in filteredItems" :key="band.name">
<p x-text="band.name"></p>
</template>
</div>
Этот ответ был размещен как edit на вопрос [Решено] Заставить работать строку поиска в AlpineJS, где искомые элементы в x-data приходят из x-init от OP dirt1992 под CC BY-SA 4.0.