【问题标题】:Using Angular inside of a bootstrap popover在引导弹出框内使用 Angular
【发布时间】:2014-09-04 00:40:46
【问题描述】:

我正在尝试在具有 ng-repeat 的 Bootstrap 弹出框内创建一个表来创建行,但似乎角度失败了,我不知道为什么。

HTML:

<a  id="showDays"
    type="button"
    class="btn btn-success btn-xs pull-right"
    data-toggle="popover"
    data-placement="left"
    data-html="true"
    title="Popover title"
    data-content=
    '<table class="table table-condensed">
       <tbody>
         <tr ng-repeat="d in days">
           <td>{{d}}</td>
         </tr>
       </tbody>
     </table>'>
      <i class="fa fa-clock-o fa-lg"></i>
</a>
<script type="text/javascript" >
  $('#showDays').popover();
</script>

控制器:

$scope.days = [
  'Sunday',
  'Monday',
  'Tuesday',
  'Wednesday',
  'Thursday',
  'Friday',
  'Saturday'
];

结果是弹出框主体有一排是空的。任何帮助表示赞赏。谢谢!

【问题讨论】:

  • 为什么不使用 angular ui bootstrap 并以 angular 方式进行
  • 显然这在 ui bootstrap 中不受支持。 github.com/angular-ui/bootstrap/issues/220
  • 哦,好的..您使用的是哪个版本的引导程序?
  • 我的 Bootstrap 是 V3.1.1
  • ui-bootstrap 项目最大的问题之一是它们不支持对其指令进行自定义模板。

标签: javascript angularjs twitter-bootstrap popover


【解决方案1】:

似乎您想要实现的目标在 Angular 版本中尚不支持,您可以创建自己的指令并执行类似的操作;-

.directive('popover', function($compile, $timeout){
  return {
    restrict: 'A',
    link:function(scope, el, attrs){
      var content = attrs.content; //get the template from the attribute
      var elm = angular.element('<div />'); //create a temporary element
      elm.append(attrs.content); //append the content
      $compile(elm)(scope); //compile 
      $timeout(function() { //Once That is rendered
        el.removeAttr('popover').attr('data-content',elm.html()); //Update the attribute
        el.popover(); //set up popover
       });
    }
  }
})

并在您的弹出框 html 中添加指令属性 popover:-

 <a popover  id="showDays"
    type="button"
    class="btn btn-success btn-xs pull-left"
    data-toggle="popover"
    data-placement="right"
    data-html="true"
    title="Popover title"
    data-content=
    '<table class="table table-condensed">
       <tbody>
         <tr ng-repeat="d in days">
           <td ng-bind="d"></td>
         </tr>
       </tbody>
     </table>'>
      <i class="fa fa-clock-o fa-lg">Click me</i>
  </a>

Demo

让它更具可配置性,通过设置,Demo:-

【讨论】:

  • 感谢演示!你能解释一下为什么你需要在 标签中使用 ng-bind="d" 而不是 {{d}} 吗?
  • @Elementary 在这种情况下不多,通常我更喜欢使用 ng-bind 来对抗{{}}
  • 我的意思是我尝试使用 {{d}} 而不是 ng-bind 但它不起作用。为什么是这样?我问是因为我想做&lt;td&gt;{{d}}:&lt;/td&gt;。我可以通过&lt;td&gt;&lt;span ng-bind="d"&gt;&lt;/span&gt;:&lt;/td&gt; 来做到这一点我知道,但我只是好奇
  • 有趣。使用 ng-bind 解决了我的问题。谢谢! :-)
  • 这是旧的......但是有没有办法在没有 jQuery 的情况下做到这一点?
【解决方案2】:

您可以使用 angular-strap popovers 使这项工作开箱即用。

Angular Strap Project

Angular Strap 是正确的原生引导指令。所以基本上它看起来像这样:


用于调用/激活弹出框的 HTML

<a  id="showDays"
type="button"
class="btn btn-success btn-xs pull-right"
data-trigger="hover" //i wasn't sure what trigger you wanted
ng-model="days"
data-placement="left"
data-html="true"
title="Popover title" //optional
data-template="file-path/to-local-HTML-template.html"
bs-popover>
</a>

弹出模板

    <div class="popover" tabindex="-1">
    <div class="arrow"></div>
    <h3 class="popover-title" ng-bind-html="title">Your Title</h3>
    <div class="popover-content">
       <table class="table table-condensed">
           <tbody>
               <tr ng-repeat="d in days">
                   <td ng-bind="d"></td>
               </tr>
           </tbody>
       </table>'>
  <i class="fa fa-clock-o fa-lg">Click me</i>
    </div>
</div>

如果这不起作用,它应该是 99.9%,并且通过查看角带的文档来填补空白不应该花费太多精力。他们有很棒的文档。对于 boostrap 3 的其余大部分组件,strap 项目也有很好的实现。

Plukr using the above code for popover demo

就像我说的那样,那里的代码大约有 99%,但为了加倍努力,我做了一个 plunk 演示来准确展示它是如何完成的。

【讨论】:

  • Angular Strap 看起来确实是一个不错的项目,但我尝试了几个小时才能让它工作,但我做不到:(我可能稍后再试一次。
  • 我在 bs-popover 指令的 HTML 中有一个小错字,我忘记关闭 a 标签。我在我原来的帖子中添加了一个关于如何做到这一点的 plunkr。
猜你喜欢
相关资源
最近更新 更多
热门标签