Разделять строку при вставке запятой и добавлять ее в массив строк

#javascript #html #express #ejs

#javascript #HTML #выразить #ejs

Вопрос:

У меня есть входные данные, которые преобразуют строки в «стилизованные теги», когда пользователь вводит запятую, затем, когда форма отправлена, строки помещаются в массив под названием «содержимое».

В представлениях EJS я печатаю результат следующим образом, <%= course.content %> но результат, который я получаю, 'string1,string2,string3,string4' и чего я добиваюсь, так это того, что при вводе в массив каждая строка должна быть другим элементом:

 content ['string1','string2','string3','string4']
  

только тогда она будет правильно отображаться в моих представлениях путем зацикливания массива. Я хочу добиться этого только с помощью JavaScript или jQuery, пожалуйста.

ОБНОВЛЕНИЕ: вот как я визуализирую в своем представлении

 <ul>
   <% var i; for (i = 0; i < course.content.length; i  ) { %>
     <li><i class="fas fa-check"></i> <%= course.content %></li>
   <% }; %>
</ul>
  

ОБНОВЛЕНИЕ: это мой маршрут, по которому выполняется этот POST-запрос

 router.post("/", middleware.isLoggedIn, function(req, res) {
  Course.create(req.body.course, function(err, course) {
     if (err) {
       req.flash("error", err.message);
       return res.redirect("back");
     }
       res.redirect("/courses/"   course.id);
  });
});
  

РЕШЕНО! используя разделение на стороне сервера следующим образом:

 router.post("/", middleware.isLoggedIn, function(req, res) {
   Course.create(req.body.course, function(err, course) {
     if (err) {
       req.flash("error", err.message);
       return res.redirect("back");
     } else {
       var content = req.body.course.content.toString().split(",");
       course.content = content;
       course.save();
       console.log(course.content);
       res.redirect("/courses/"   course.id);
     }
   });
});
  

Вот другое решение в JavaScript с использованием функции beforesubmit() от @garry man, см. Ниже.

codepen

Комментарии:

1. 'string1,string2,string3,string4'.split(',') поможет

2. вместо того, чтобы печатать <%= course.content %> , вы можете фактически выполнить цикл через него <% для (var i = 0; i content. длина; i ) { // сделай что-нибудь} %>

3. Спасибо, но где? Я хочу, чтобы строки были разделены перед отправкой в базу данных, я попытался добавить .split(‘,’) в конце создания тега, но это не решает проблему

4. @ShoyebMemon Я запускаю цикл, но поскольку есть только один элемент, он печатает ‘string1, string2, string3, string4’ вместо печати четырех разделенных элементов

5. Вы пробовали отладку req.body.course и проверяли ее значение во время выполнения?

Ответ №1:

Долгий путь

В противном случае есть один способ обойти — сколько тегов вы вводите, столько входных элементов вы должны сгенерировать.

Например, мои входные теги являются foo,bar , тогда будут сгенерированы 2 входных тега, как

                                                             Note square brackets below
<input id="hiddenInput" type="hidden" name="course[content][]" required>
<input id="hiddenInput" type="hidden" name="course[content][]" required>
  

Это долгий путь.

Другой способ

Если вы отправляете форму через AJAX, то вы можете манипулировать данными перед отправкой и преобразовывать строку в массив с помощью .split(',') .

Другой способ (на стороне сервера)

Разделять строку по , на стороне сервера.

Ответ №2:

Хорошо, итак, проблема в том, что вы отправляете форму, содержащую один ввод, который может содержать только строковые значения.

Практика HTML-формы заключается в том, чтобы иметь один ввод для каждого размещаемого элемента массива, например:

 <input name="course[content]"/> //value 1
<input name="course[content]"/> //value 2
<input name="course[content]"/> //value 3
  

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

 function beforesubmit(){
  let submitVal = document.getElementById('hiddenInput');
  let values  = submitVal.value.split(',');

  //let's get the container of the params passed to post
  let paramsContainer = submitVal.parentElement;
  // remove the param containting the string with commas as we're generating new ones
  paramsContainer.removeChild(submitVal); 

  for(let i =0; i<values.length;i  ){
    //for each value, add a submit param containing each value
    let tmp = document.createElement('input');
    tmp.setAttribute('type','hidden');
    tmp.setAttribute('name','course[content]');
    tmp.setAttribute('value',values[i]);
    paramsContainer.appendChild(tmp);
  }
  document.getElementsByTagName('form')[0].submit();
}
  

чтобы вызвать эту функцию, замените вашу submit input на эту:

 <input type="button" value="submit" onclick="beforesubmit()">
  

Используя этот код, вы уже можете видеть POST разницу в запросе между before и after. В вашем codepen он отправляет один параметр, в то время как с помощью этого фрагмента кода вы собираетесь отправить массив course['content'] .

Теперь все зависит от того, как вы собираетесь извлекать данные на стороне сервера, вы должны извлекать course['content'] параметр в виде массива.

Комментарии:

1. Спасибо, похоже, отличное решение! однако по какой-то причине моя кнопка ввода не выполняет функцию onclick, и она ничего не делает. Я обновил codepen вашим решением, поскольку, на мой взгляд, это правильный способ справиться с этим. codepen.io/gabonessi/pen/eXymKE

2. вы должны поместить beforesubmit() функцию в конец js-скрипта, после закрывающих скобок }); предыдущей области видимости

3. конечно… Я сделал, но теперь он отправляет только последний тег, также я понимаю, что это работает только тогда, когда я выбираю форму по имени тега, когда я выбираю с помощью ID, это ничего не делает.

4. Не совсем: приведенный выше codepen работает отлично. Проверьте вкладку » СЕТЬ » в консоли разработчика, следите за отправленными данными формы. Проблема по-прежнему заключается в том, как вы извлекаете результаты на стороне сервера. Можете ли вы опубликовать код, в котором вы это делаете?

5. Я обновил сообщение тем, как я получаю результат на сервере в моем локальном приложении. В codepen, если я проверяю вкладку сеть, я ничего не вижу. В консоли я получаю сообщение «Не удалось загрузить ресурс: сервер ответил со статусом 404 ()», но после отправки интерфейс codepen показывает мне последний введенный мной тег: course {«content» => «hello»}