<script context="module">
import GhostContentAPI from '@tryghost/content-api';
// const api = 'http://localhost/posts';
const api = new GhostContentAPI({
url: 'http://localhost',
key: '95a0aadda51e5d621abd2ee326',
version: "v3"
});
export async function preload({ params, query }) {
try {
const response = await api.posts.browse({ limit: 5, fields: 'title, slug' });
return {
posts: response
}
} catch(err) {
console.log('Error');
}
}
</script>
<script>
export let posts;
</script>
<svelte:head>
<title>Blog</title>
</svelte:head>
<h1>Recent posts</h1>
<ul>
{#each posts as post}
<li>
<a rel='prefetch' href='blog/{post.slug}'>{post.title}</a>
</li>
{/each}
</ul>
Я использую ванильный JavaScript и Svelte, чтобы просто получить список сообщений блога, которые являются объектами из Ghost Blog Rest API. Функция Ghost API работает нормально и извлекает правильные объекты, но проблема начинается при попытке использовать блок Svelte {#each}
для отображения каждого объекта, потому что они не находятся в массиве, и я не могу понять, как это исправить. Вот точное сообщение об ошибке в консоли:
Error: {#each} only iterates over array-like objects.
Написание console.log(response)
после объявления const response
выводит прикрепленное изображение, но только если я сначала закомментирую блок {#each}
.
Я предполагаю, что мне просто нужно переместить 5 объектов в массив, но я также не понимаю, почему console.log
выше работает только тогда, когда HTML закомментирован.
posts.length
в своем шаблоне, чтобы увидеть, что это такое. Интересно, не сталкиваетесь ли вы с проблемой асинхронности? - person Taplar   schedule 08.04.2020response.length
возвращает5
, но записьposts.length
после экспорта возвращаетCannot read property 'length' of undefined
. - person Joe Berthelot   schedule 08.04.2020console.log(JSON.stringify(posts, null, 2))
. См. странное поведение массива в javascript для получения дополнительной информации о том, что я показывает, когда вы наводите на него курсор. - person Heretic Monkey   schedule 08.04.2020{#each}
в шаблоне, и вы можете получить что-то другое. Я не знаю, стройный, призрачный или саперный, но обычно есть способ сообщить шаблону, что массив будет заполнен асинхронно. Может, если бы ты только что сделалexport let posts = [];
? - person Heretic Monkey   schedule 08.04.2020catch
в приведенном выше утверждении. - person Joe Berthelot   schedule 08.04.2020