Невозможно заставить функцию предварительной загрузки знать об изменениях содержимого в хранилище - сапер - PullRequest
0 голосов
/ 01 мая 2020

Мне нужна помощь, я боролся с этим в течение нескольких дней без удачи. Я изменил пример блога, чтобы обработать мой раздел проэктов. Мне удалось заставить его работать из настраиваемого доступного для записи файла хранилища, я могу выполнить все операции CRUD внутри хранилища, и они обновляются в компонентах, которые в них нуждаются. Все, кроме страницы [slug] .svelte.

, кажется, что даже файл [slug]. JSON. js имеет подписку, контекстный модуль [slug] .svelte не может получить хранилище изменения после того, как они сделаны.

вот мой файл [slug]. JSON. js.

import proyectos from "./_projectsStore.js";
let projects;
proyectos.subscribe(p => {
    projects = p;
})

const lookup = new Map();
projects.forEach(project => {
    lookup.set(project.slug, JSON.stringify(project));
});

export function get(req, res, next) {
    // the `slug` parameter is available because
    // this file is called [slug].json.js
    const { slug } = req.params;

    if (lookup.has(slug)) {
        res.writeHead(200, {
            'Content-Type': 'application/json'
        });

        res.end(lookup.get(slug));
    } else {
        res.writeHead(404, {
            'Content-Type': 'application/json'
        });

        res.end(JSON.stringify({
            message: `Not found`
        }));
    }
}

, поскольку, как мне кажется, это проблема с функцией предварительной загрузки, которая не знает об изменениях после того, как они сделаны.

<script context="module">
  export async function preload({ params, query }) {
    // the `slug` parameter is available because
    // this file is called [slug].html
    const res = await this.fetch(`portafolio/${params.slug}.json`);
    const data = await res.json();
    if (res.status === 200) {
      return { project: data };
    } else {
      this.error(res.status, data.message);
    }
  }
</script>

любая идея?

1 Ответ

1 голос
/ 05 мая 2020

Если я правильно понимаю, вы хотите, чтобы ваша карта lookup всегда содержала сопоставление слагов с проектами, которые постоянно обновляются в хранилище proyectos.

В этом случае то, как вы заполняете карту, даст вам в лучшем случае только первую версию (или, может быть, даже упадет с ошибкой), поскольку карта никак не связана с хранилищем proyectos.

Способ подключения они должны были бы заполнить карту внутри функции подписки:

// [slug].json.js
const lookup = new Map();
proyectos.subscribe(p => {
  lookup.clear();
  p.forEach(project => {
    lookup.set(project.slug, JSON.stringify(project));
  });
})

Таким образом, карта будет заполняться каждый раз, когда изменяется proyectos хранилище, что позволит вашей конечной точке реагировать на изменения.

...