возврат или поиск объекта из html-ввода в выражении узла - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть форма html / handlebars, настроенная с помощью бэкэнда Node / Express.Форма предлагает варианты, заполненные из базы данных.Я могу получить форму, которая возвращает выбранное пользователем значение и сохранить его на моем mongodb, но мне действительно нужен весь объект.

{{#each proxyObj}}
            <p>
                <label>
                    <input type="radio" name="proxyTitle" value="{{title}}"/>
                    <span>{{title}}</span>
                </label>
            </p>
            {{/each}}

и это выражение:

router.post("/proxies/:id", ensureAuthenticated, (req, res) => {
  Project.findOne({
       _id: req.params.id
    }).then(project => {
    const newProxy = {
        proxyTitle: req.body.proxyTitle
        // I need the other object values to go here, or to be able to retrieve them later
   };
    // Add to proxy array on the Project object in the collection
    project.proxies.push(newProxy);

    project.save().then(project => {
    res.redirect(`/projects/stakeholders/${project.id}`);
    });
  });
});

Разумнее ли попытаться загрузить весь объект как значение в поле ввода или вернуть идентификаторобъект, и посмотреть его в БД?Мне нужно отобразить часть возвращенной информации об объекте на той же странице, а также использовать ее позже.Что является более эффективным, и как лучше всего его достичь?

1 Ответ

0 голосов
/ 12 декабря 2018

Если я правильно понял, проблема в том, что вы пытаетесь поместить несколько входов с одинаковым именем в одну форму в <input type="radio" name="proxyTitle" value="{{title}}"/>, что дает вам что-то вроде

<input type="radio" name="proxyTitle" value="Title 1"/>
<input type="radio" name="proxyTitle" value="Title 2"/>
<input type="radio" name="proxyTitle" value="Title 3"/>

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

В вашем случае проще всего было бы добавить индекс к именам параметров.Итак, ваша форма будет выглядеть следующим образом:

{{#each proxyObj}}
    <p>
        <label>
            <input type="radio" name="proxies[{{@key}}]" value="{{this}}"/>
            <span>{{this}}</span>
        </label>
    </p>
{{/each}}    

(обратите внимание, что если proxyObj является массивом, вам придется использовать @index вместо @key; также, в зависимости от proxyObj структура полей, вам, возможно, придется использовать this.title в качестве значений для отображения и т.п.).

Что касается обработки на стороне сервера, вам придется циклически проходить через proxies, который вы получаетеи обрабатывать их один за другим, например

  router.post("/proxies/:id", ensureAuthenticated, (req, res) => {
    Project.findOne({
      _id: req.params.id
    }).then(project => {
      project.proxies = []; // this is only in case you wanna remove the old ones first
      const proxies = req.body.proxies;
      for(let i = 0;  i < proxies.length; i++) {
        // Add to proxy array on the Project object in the collection
        project.proxies.push({ proxyTitle: proxies[i].title });
      }

      project.save().then(project => {
      res.redirect(`/projects/stakeholders/${project.id}`);
    });
  });
});
...