Синтаксический анализ шаблонов с переменными и парами переменных с помощью jQuery

#javascript #jquery

#javascript #jquery

Вопрос:

В моем приложении есть файлы шаблонов, которые я хотел бы обработать с помощью jQuery. Я не могу сделать это на стороне сервера, поэтому я должен сделать это с помощью JS. В моем скрипте есть объект, который содержит переменные, которые должны быть проанализированы с указанными значениями. Если значением является объект (пара переменных), HTML-код между этими тегами дублируется при каждой итерации этого объекта. Вот что я имею в виду:

 citizen_results = [
{
    firstname: "Elliot",
    lastname: "Stabler",
    dateofbirth: "12/01/70",
    sex: "M",
    height: "180cm",
    id: 1
  },
  {
    firstname: "Olivia",
    lastname: "Benson",
    dateofbirth: "03/15/78",
    sex: "F",
    height: "180cm",
    id: 2
  }
  {
    firstname: "John"
    lastname: "Munch",
    dateofbirth: "04/08/48",
    sex: "M",
    height: "180cm",
    id: 3
  }
]

data = {
    results: citizen_results,
    pagination: "<ul><li><a href="#">1</a></li></ul>'
}

parseTemplate('citizen-results.html', data);

function ParseTemplate(file, data){
        $.get('html/' file, function(response){
            var contents = response
            Object.keys(data).forEach(function(key,index) {
                if(isObject(data[key])){
                    $.each(data[key], function(k, v){
                        
                    })
                } else {
                    contents.replace("{"   key   "}", data[key]);
                }
            })
        })
        $('#content-container').html(contents);
    }
function isObject(var item){
        return typeof item === 'object' amp;amp; item !== null
    }
  

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

 <div id="page-content">
    <h1>Citizens</h1>
    <div id="search-box">
        <h2>Search Citizens</h2>
        <input type="text" name="citizen_name">
    </div>
    {citizen_results}
    <div class="media">
        <div class="media-body">
            <h3>{firstname} {lastname}</h3>
            <ul class="media-meta">
                <li><i class="fa fa-child"></i>{height}</li>
                <li><i class="fa fa-calendar"></i>{dateofbirth}</li>
                <li><i class="fa fa-mercury"></i>{sex}</li>
                <li><a href="#" data-event="loadCitizenProfile" data-resource-id="{id}"><i class="fa fa-eye"></i></a></li>
            </ul>
        </div>
    </div>
    {/citizen_results}
    {pagination}
</div>
  

И конечный результат HTML должен выглядеть так:

 <div id="page-content">
    <h1>Citizens</h1>
    <div id="search-box">
        <h2>Search Citizens</h2>
        <input type="text" name="citizen_name">
    </div>
    <div class="media">
        <div class="media-body">
            <h3>Elliot Stabler</h3>
            <ul class="media-meta">
                <li><i class="fa fa-child"></i>180cm</li>
                <li><i class="fa fa-calendar"></i>12/01/70</li>
                <li><i class="fa fa-mercury"></i>M</li>
                <li><a href="#" data-event="loadCitizenProfile" data-resource-id="1"><i class="fa fa-eye"></i></a></li>
            </ul>
        </div>
    </div>
    <div class="media">
        <div class="media-body">
            <h3>Olivia Benson</h3>
            <ul class="media-meta">
                <li><i class="fa fa-child"></i>180cm</li>
                <li><i class="fa fa-calendar"></i>03/15/78</li>
                <li><i class="fa fa-mercury"></i>F</li>
                <li><a href="#" data-event="loadCitizenProfile" data-resource-id="2"><i class="fa fa-eye"></i></a></li>
            </ul>
        </div>
    </div>
    <div class="media">
        <div class="media-body">
            <h3>John Munch</h3>
            <ul class="media-meta">
                <li><i class="fa fa-child"></i>180cm</li>
                <li><i class="fa fa-calendar"></i>04/08//48</li>
                <li><i class="fa fa-mercury"></i>M</li>
                <li><a href="#" data-event="loadCitizenProfile" data-resource-id="3"><i class="fa fa-eye"></i></a></li>
            </ul>
        </div>
    </div>
    <ul>
      <li><a href="#">1</a></li>
    </ul
</div>
  

Я не совсем уверен, что делать с кодом внутри $.each(data, function(k, v)

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

1. Если вам нужно сделать много разных версий на вашем сайте, посмотрите на использование сценария шаблона, например handlebars.js или более современный фреймворк, такой как React, Vue, Angular и т. Д

2. Я дал handlebars.js попытка, но она продолжает выдавать мне нераспознанную ошибку выражения с помощью HTML, который я написал выше. Есть идеи, почему? для меня html выглядит нормально

3. Не без изменения синтаксиса в соответствии с ожидаемым синтаксисом handlebars