AngularJS добавляет HTML в элемент ng-repeat - PullRequest
2 голосов
/ 29 апреля 2019

Используя AngularJS, мне нужно добавить HTML к элементам ng-repeat, используя селектор: 'objectMapParent-' + post._id

  <div ng-repeat="post in posts">

    <div id="{{ 'objectMapParent-' + post._id }}">
      <h5 style="color:blue; margin-top: 3px;">{{post.title}}</h5>

    </div>
  </div>

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

 $scope.posts = [{
    _id: "1",
    title: "map of london"
  }, {
    _id: "2",
    title: "map of brazil"
  }, {
    _id: "3",
    title: "map of usa"
  }];

  $scope.posts.forEach(function(post) {
    // console.log(post);

    createElement("#objectMapParent-" + post._id, function() {
      //create map here after append 
    });
  });

Эта функция обратного вызова получает селектор elementParent, который мы используем для поиска узла в DOM, а затем добавляем нужный HTML

  var createElement = function(elementParent, cb) {

    var aux = elementParent;

    var postId = aux.replace("#objectMapParent-", "");

    var myElement = angular.element(document.querySelector(elementParent));

    var html = "<div id='objectMap-" + postId + "'><div id='BasemapToggle-" + postId + "'></div></div>";
    myElement.append(html);

    cb();
  };

Но что-то не работает, насколько мне известно, функция document.querySelector не может найти селектор.

Мне кажется, что когда он пытается выбрать, узел еще не существует в DOM.

Я воспроизвел код в коде , это может помочь.

1 Ответ

2 голосов
/ 29 апреля 2019

Как инкапсулировать код jQuery в пользовательскую директиву

Любой код jQuery, который управляет DOM, должен быть инкапсулирован в пользовательскую директиву , чтобы он выполнялся, когда инфраструктура AngularJS директива ng-repeat создает элемент.

<div ng-repeat="post in posts">
    <div id="{{ 'objectMapParent-' + post._id }}">
         <h5 style="color:blue; margin-top: 3px;">{{post.title}}</h5>
         <my-element post="post"></my-element>
    </div>
</div>
app.directive("myElement", function() {
    return {
        link: postLink,
    };
    function postLink(scope,elem,attrs) {
        var post = scope.$eval(attrs.post);
        var html = `
          <div id="objectMap-${post._id}">
            <div id="BasemapToggle-${post._id}">
            </div>
          </div>
        `;
        elem.append(html);
    }
})

Чтобы использовать jQuery, просто убедитесь, что он загружен до angular.js файла.

Для получения дополнительной информации см.

...