Функция рендеринга Mustache.js, возвращающая пустую строку для страницы, отображаемой с помощью Chevron

У меня есть следующий код для отображения веб-страницы с использованием шаблонов усов (упрощено для ясности)

<!doctype html>
<html lang = "en" data-theme = "dark">
  <head>
    <script src = "https://cdnjs.cloudflare.com/ajax/libs/mustache.js/4.1.0/mustache.min.js"</script>
    <link rel = "stylesheet" href = "/static/css/pico.min.css">

  </head>

  <body>
    <main class = "container">
      <button type = "submit"
          id = "submitBtn"
          onclick= "foo();">
          Foo
      </button>

      <script>
        function foo() {
          var newHTML = Mustache.render("{{food}}", { food: "tacos" });
          console.info("newHTML:", newHTML)
        }
      </script>

    </main>
  </body>
</html>

Я ожидаю, что значением newHTML будет «tacos», но вместо этого это пустая строка. Я подозреваю, что это как-то связано с тем, что сама страница изначально рендерится из Python с использованием Chevron (я не могу обойти это стороной, это часть большей кодовой базы). Я попытался создать ту же страницу в отдельном файле HTML, и значение newHTML действительно установлено на «tacos».

<!doctype html>
<html>
<head>
    <title>Mustache Example</title>
    <script src = "https://cdnjs.cloudflare.com/ajax/libs/mustache.js/4.1.0/mustache.min.js"</script>
</head>
<body>
    <h1 id = "heading">{{food}}</h1>
    <script>
        var newHTML = Mustache.render("{{food}}", { food: "tacos" });
        console.info(newHTML)
        document.querySelector('#heading').innerHTML = newHTML
    </script>
</body>
</html>

Пожалуйста помоги! Только что полдня ходил по кругу с ChatGPT

Я пытался использовать разные версии Mustache.js, используя блок try/catch, упрощая свой код, записывая в консоль все переменные, и проблема все еще не устранена.

Опубликуйте минимально воспроизводимый пример с деталями отладки.

relent95 30.03.2023 08:54
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваше подозрение, скорее всего, верно: Chevron встречает {{food}} и заменяет его пустой строкой до того, как браузер и Mustache.js смогут это сделать.

Вы можете предотвратить это, временно изменив разделители тегов вокруг частей шаблона, которые должны отображаться на стороне клиента. Chevron больше не будет распознавать {{food}} как тег и не трогать его. Удобно, что он удалит теги-разделители изменений, поэтому клиент их не увидит.

Например, вы можете изменить строку с вашим шаблоном на стороне клиента на это:

var newHTML = Mustache.render("{{=[[ ]]=}}{{food}}[[ = {{ }}=]]", { food: "tacos" });

В этом примере я плотно поместил теги-разделители изменений вокруг {{food}}. Это не обязательно; для Chevron все выглядит как обычный текст, так что теги можно ставить куда угодно. Если есть часть страницы только с клиентскими шаблонами и без тегов, которые должны обрабатываться Chevron, вы можете обернуть весь раздел одной парой тегов-разделителей изменений. Например вот так:

{{=[[ ]]=}}
var newHTML = Mustache.render("{{food}}", { food: "tacos" });
[[ = {{ }}=]]

Другие вопросы по теме