Использование чего-то вроде ngRepeat в Javascript

#javascript #html #arrays #angularjs #angularjs-directive

#javascript #HTML #массивы #angularjs #angularjs-директива

Вопрос:

Я хочу заполнить выпадающий список данными из массива. Приведенный ниже код — это то, что я бы сделал, если бы работал с AngularJS. Я хочу знать, есть ли способ сделать это в javascript или каким-то образом разрешить ng-options работать здесь.

   var myLatlng = new google.maps.LatLng(-25.363882,131.044922);
  var mapOptions = {
    zoom: 4,
    center: myLatlng
  };

  var map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);

    var city = ["NewYork", "Chicago", "Florida"];

  var contentString = 
      `<div class="dropdown">
   <select>
     <option ng-options="item for item in ${city}">{{item}}</option>
   </select>
</div>`;

  var infowindow = new google.maps.InfoWindow({
      content: contentString
  });

  var marker = new google.maps.Marker({
      position: myLatlng,
      map: map,
      title: 'Uluru (Ayers Rock)',
//    zIndex: Math.round(myLatlng.lat() * -100000) << 5
  });
  google.maps.event.addListener(marker, 'click', function() {
    infowindow.setContent(contentString);
    infowindow.open(map,marker);
  });
  

ДЕМОНСТРАЦИЯ: https://jsfiddle.net/spdmu6we/5 /

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

1. Вот решение JavaScript

2. @RandyCasburn это работает, но есть ли способ реализовать это так, как это было у меня, без необходимости помещать HTML в раздел HTML и иметь там строковую переменную содержимого.

3. Да, у вас есть два варианта: 1. Используйте синтаксический анализ строк для создания строки HTML, а затем передайте ее в качестве содержимого 2. Проанализируйте имеющуюся у вас строку в DOM-узле и используйте предоставленный мной код.

4. Вот решение для конкатенации строк: jsfiddle.net/1wrmde9y

5. Да, это работает, вы можете указать это как ответ, чтобы я мог его принять

Ответ №1:

Согласно вашему комментарию, вы предпочитаете делать это без и HTML `.

Итак, у вас есть два варианта: 1. Используйте синтаксический анализ строк для создания строки HTML, а затем передайте ее в качестве содержимого 2. Проанализируйте имеющуюся у вас строку в DOM-узле и используйте предоставленный мной код.

Это заменяет материал GMap универсальным кодом. Вы все равно сможете использовать код, связанный с DOM.

Вот решение:

 var city = ["NewYork", "Chicago", "Florida"];
const pre = '<div class="dropdown"><select>';
const post = '</select></div>';
let options = '';
city.forEach(city => {
  let o = `<option value=${city}>${city}</option>`;
  options  = o;
});
content = pre   options   post;

var infowindow = document.createElement('div');
infowindow.innerHTML = content;
infowindow.style.display = 'none'

var marker = document.createElement('button');
marker.innerText = "Click me";

marker.addEventListener('click', () => {
  document.body.appendChild(infowindow);
  infowindow.style.display='block';
});
document.body.appendChild(marker);  
 <div id="map-canvas"></div>  

Ответ №2:

Два типичных способа создания большого количества элементов в javascript: либо:

  1. объедините длинную строку элементов вместе, например "<option>Banana</option><option>Apple</option>" , а затем используйте .innerHTML для родительского select

  2. используйте javascript для независимого создания каждого узла like document.createElement("OPTION") и .appendChild it.

Для каждого из них есть последствия для производительности. Но собственный javascript не выполняет такого рода шаблонизации.

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

1. Ну, я попробовал второй вариант, и я продолжаю получать нулевую ошибку jsfiddle.net/wegs6okb/1

2. Это потому, что у вас нет элемента select в HTML, но вы пытаетесь получить к нему доступ.