Куда поместить шаблон для popover-шаблона в angular bootstrap?

Я хочу создать всплывающее окно html с помощью angular-bootstrap popover-template

Сама директива находится в пути:

приложение / скрипты / директивы / popover.js

angular.module('c2gyoApp')
  .directive('tariffPopover', function () {
    return {
      restrict: 'A',
      transclude: true,
      scope: {
        text: '@tariffPopover'
      },
      template:
        '<span ng-transclude></span>' +
        '&nbsp;' +
        '<span popover-placement="right" ' +
        '      popover-template="pop.html" ' +
        '      popover-trigger="mouseenter" ' +
        '      class="fa fa-info-circle">' +
        '</span>'
    };
  });

Pop.html - это простой файл HTML:

<h1>Hi</h1>

Я использую это в представлении в

app / views / c2g.html

<div class="checkbox">
  <label>
    <input type="checkbox"
           ng-model="rental.airport">
    <span tariff-popover="{{info.airport}}">
      Flughafenpauschale
    </span>
    <br/>
  </label>
</div>

Я не могу понять, куда мне поместить шаблон pop.html. Я пробовал следующие пути:

  • В базовом каталоге приложения app / pop.html
  • В том же каталоге, что и директива popover.js app / scripts / pop.html.
  • В том же каталоге, что и c2g.html представление app / views / pop.html.

Я также пробовал установить пути шаблона popover к app / pop.html, app / scripts / pop.html и app / views / pop.html . Однако всплывающее окно не появляется. Какой правильный путь для шаблона html?

@Aviro меняет содержимое pop.html на

<script type="text/ng-template" id="pop.html">
   <h1>Hi</h1>
</script>

не помогает.


person mles    schedule 06.07.2015    source источник
comment
Я приложил пример плункера для более подробной информации.   -  person Aviro    schedule 10.07.2015


Ответы (3)


popover-template должен быть переменной. Это работает:

app / views / c2g.html

<div class="checkbox">
  <label>
    <input type="checkbox"
           ng-model="rental.airport">
    <span tariff-popover="views/pop.html">
      Flughafenpauschale
    </span>
    <br/>
  </label>
</div>

приложение / скрипты / директивы / popover.js

angular.module('c2gyoApp')
  .directive('tariffPopover', function () {
    return {
      restrict: 'A',
      transclude: true,
      scope: {
        text: '@tariffPopover'
      },
      template:
        '<span ng-transclude></span>' +
        '&nbsp;' +
        '<span popover-placement="right" ' +
        '      popover-template="text" ' +
        '      popover-trigger="mouseenter" ' +
        '      class="fa fa-info-circle">' +
        '</span>'
    };
  });
person mles    schedule 12.07.2015

Если вы действительно хотите иметь дело с внешним шаблоном, вы можете определить его в другом HTML-файле (который используется другим представлением), как показано ниже.

<script type="text/ng-template" id="pop.html">
   <h1>Hi</h1>
</script>

Это может быть вызвано и встроено в директиву по желанию.

Я предпочитаю обновить директиву, как показано ниже.

    angular.module('c2gyoApp')
      .directive('tariffPopover', function () {
        var getTemplate = function () {
            var template = '';
                template = $templateCache.get("pop.html");
            }
            return template;
        };

    return {
      restrict: 'A',
      transclude: true,
      scope: {
        text: '@tariffPopover'
      },
      link: function(scope, element, attrs) {
            var popOverContent = getTemplate();
            popOverContent = $compile("<div>" + popOverContent+"</div>")(scope);

            var options = {
                //title       : title,
                content     : popOverContent,
                placement   : "right",
                html        : true,
                date        : scope.date,
                trigger     : "hover"
            };
            $(element).popover(options);
      }
    };
  });

Это плункер, который может помочь лучше понять это.

person Aviro    schedule 07.07.2015
comment
Я добавил в шаблон тег <script>. Не помогает. Можете ли вы исправить синтаксис вашего альтернативного подхода? - person mles; 07.07.2015
comment
Подправил синтаксис. Важно помнить, что как только вы измените содержимое с помощью внешнего шаблона, вам нужно будет использовать $ compile для компиляции перед ссылкой на область видимости. Здесь используется именно такой подход. - person Aviro; 07.07.2015
comment
Дайте мне знать, если вы добьетесь успеха со вторым подходом. Я использую это в своих решениях для отображения пользовательских HTML-шаблонов с всплывающими окнами. См. Подробности в моей доске. plnkr.co/edit/8tB6bA?p=preview. - person Aviro; 09.07.2015
comment
Спасибо за усилия, но я бы предпочел положиться на то, что было создано раньше. Я попробовал ваш подход, но не смог загрузить свой html-шаблон в templateCache. - person mles; 13.07.2015
comment
Вы сослались на прилагаемый Plunker. Это рабочее решение. Этот метод шаблонов называется встроенными шаблонами и должен быть определен в том же HTML-файле. Если шаблон находится за пределами страницы, вам необходимо предварительно загрузить их в $templateCache с помощью ajax $http. С другой стороны, почему вы проголосовали против этого подхода. Это гораздо лучший универсальный подход, чем предложенный вами. - person Aviro; 13.07.2015

Есть атрибут popover, который принимает фактический текст, который вы хотите отобразить. Я думаю, что это сработает (вы можете найти пример на той же странице, на которую вы указали в своем вопросе).

Это выглядело бы примерно так:

angular.module('c2gyoApp')
  .directive('tariffPopover', function () {
    return {
      restrict: 'A',
      transclude: true,
      scope: {
        text: '@tariffPopover'
      },
      template:
        '<span ng-transclude></span>' +
        '&nbsp;' +
        '<span popover-placement="right" ' +
        '      popover="<h1>Hi</h1>" ' +
        '      popover-trigger="mouseenter" ' +
        '      class="fa fa-info-circle">' +
        '</span>'
    };
  });

Кроме того, если вы все же хотите поместить это в отдельный файл html, я не думаю, что местоположение имеет большое значение, возможно, вы просто ошибаетесь, когда я использую Angular, со мной такое часто случается.

person Roberto Soares    schedule 06.07.2015
comment
popover= экранирует HTML - person mles; 07.07.2015