【问题标题】:Angular UI Popover close button not workingAngular UI Popover 关闭按钮不起作用
【发布时间】:2015-08-13 21:14:51
【问题描述】:

我使用 angular 指令为复选框单击创建了一个弹出框。它工作得很好,但关闭按钮确实有效。这是我的示例代码。

myApp.directive('mypopover', function ($compile,$templateCache,$interpolate) {
var getTemplate = function (contentType,attrs) {
    var template = '';
    switch (contentType) {
        case 'comment':
            var template  = "<div class=''>";
                template += "<form><div class='form-group'>";
                template += "<input type='hidden' value='"+attrs.value+"' name='documentationId' id='documentationId' />";
                template += "<textarea style='width:250px;' class='form-control' name='doc_comment' id='doc_comment'>Selected for Re-Use in 2nd Trade Workflow.</textarea>";
                template += "</div>";
                template += "<div class='form-group'>";
                template += "<input type='button' value='Close' class='btn btn-primary btn-xs' ng-click=\"closePopover()\" />";
                template += "<input type='button' value='Comment' class='btn btn-primary btn-xs pull-right'  />";
                template += "</div></form><br>";
                template += "</div>";
            break;
    }
    return template;
}

return {
    restrict: "EA",
    link: function (scope, element, attrs) {            
        var popOverContent;
        var d = new Date();
        var mm = d.getMonth()+1;

        popOverContent = getTemplate("comment",attrs);

        var options = {
            content: popOverContent,
            placement: "right",
            html: true,
            date: scope.date,
            title:"Date: "+mm+"/"+d.getDate()+"/"+d.getFullYear()
        };
        $(element).popover(options);

        scope.closePopover = function() { //this block doesn't work
            alert("called"); //does not return alert
        }
    }
};
});

其中的html部分是

<div class="checkbox checkbox-primary">
    <input 
        type='checkbox'                                        
        ng-model='selectedDocIds' 
        mypopover
    />
 </div>

我尝试将 ng-click='closePopover()' 函数绑定到此 html 的主控制器,但它不起作用。我没有收到错误,但只是发生了任何事情。

有人可以帮我让这个 ng-click 事件发生吗?

谢谢

【问题讨论】:

  • 我有一个精简的版本工作正常:plnkr.co/edit/Qlvdzy?p=info 还不确定弹出窗口中的范围问题是什么
  • @wesww,我必须对从getTemplate() 返回的模板执行$compile 才能使其正常工作。它在我的 plunker 中工作但我遇到了下一个问题,下次打开弹出框时取消选中复选框。不同之处在于,当通过单击 close 按钮关闭弹出框时,我取消选中该复选框。看我的例子here
  • 当前有一个支持动态弹出框的线程,您应该在这里查看github.com/angular-ui/bootstrap/issues/…

标签: angularjs twitter-bootstrap angular-ui popover


【解决方案1】:

看看我试图回答你的问题。可能这个script on plunker 会帮助你。

customDirectives.directive('customPopover', function () {
return {
    restrict: 'A',
    template: '',
    link: function (scope, el, attrs) {
        scope.label = attrs.popoverLabel;
        $(el).popover({
            trigger: 'hover', // or click
            html: true,
            content: attrs.popoverHtml,
            placement: attrs.popoverPlacement
        });
    }
};

});

2015 年 8 月 19 日更新:

另一种解决方案...

我发现运行函数“$(element).popover('hide')”的按钮“Close”不会调用必须执行的一系列操作以正确隐藏气泡和切换复选框。所以我查看了“bootstrap.js”,发现“popover”对函数“tooltip.toggle() em>”。此外,此函数仅在页面启动时调用一次,并且仅在事件处理程序中粘贴到复选框。因此,您可以从站点下载“bootstrap.js”,进行更改并强制引导程序处理更多元素,而不是只处理一个复选框。但这有点奇怪。所以我提议在你当前的代码中只插入一个字符串并删除两个字符串。

查看您的文件“app.js”,第 47 行... 更好的是,看看my plunker。这是您的 plunker 的完整副本(分叉副本),但从第 47 行开始更改了三行。

    scope.closePopover = function() {
      $(element).click();
      // $(element).popover("hide");
      // $(element).attr({checked:false});
    }

解释...

函数“$(element).click()”模拟点击事件。在这种情况下,bootsrap 会执行所有需要的操作来隐藏气泡并取消选中复选框。

【讨论】:

  • 嗨@Golka,感谢您的尝试。但它不是我要找的。请看我的 plunker 示例plunkerdemo
  • 我已经更新了我的答案,所以我有新的解决方案给你。在“2015 年 8 月 19 日更新”之后查看我的答案的第二部分。
【解决方案2】:

问题在于 DOM 是用 html 扩展的,而 html 不是 Angular 编译的。

指令注入$compile 服务似乎是一个正确的意图。但是没用过。

   popOverContent = getTemplate("comment", attrs);
   $compile(popOverContent)(scope);//compile new contents bound to the same scope as directive

【讨论】:

  • 感谢您让我了解$compile 服务。它第一次工作,但是当我关闭后再次关闭弹出窗口时,它又回到了相同的情况,关闭按钮不会在第二次关闭弹出窗口
  • 我认为这与popover 的工作方式有关。它可能是缓存模板。你能在 plunker/fiddle 中重现它吗?
  • 嗨基里尔,实际上弹出框现在工作正常,但我试图在关闭弹出框 onclick 关闭按钮时取消选中。现在弹出框可以工作,但是取消选中复选框,这绝对是任何人想要的情况。请看我的插件here
【解决方案3】:

完成您正在构建的内容的更简单方法可能是在 this issue thread 的 Elijen 的“angular-popover-toggle”模块之上创建一个模板化指令

https://github.com/Elijen/angular-popover-toggle

我在 plunker 中做了一个基本的工作演示。然后你只需要把它变成一个可重用的指令。看看吧:

http://plnkr.co/edit/9QbPMV?p=preview

js

.controller('myCtrl', function($scope){
   $scope.demofor = 'Popover with close button';
   var d = new Date();
   var mm = d.getMonth()+1;
   $scope.title = "Date: "+mm+"/"+d.getDate()+"/"+d.getFullYear();
});

html

<br><br><br>
<div class="container">
  <h4>{{demofor}}!</h4>
  <label>
    Click here
    <input type="checkbox" ng-model="isPopoverOpen"
     popover-template="'tmpl.html'" 
     popover-toggle="isPopoverOpen"
     popover-placement="right"
     popover-title="{{title}}">
  </label>
</div>

<script type="text/ng-template" id="tmpl.html">
  <div>
    <form>
      <div class="form-group">
        <input type="hidden" value="attrs.value" name="documentationId" id="documentationId">
        <textarea style="width:250px;" class="form-control" name="doc_comment" id="doc_comment">Selected for Re-Use in 2nd Trade Workflow.</textarea>
      </div>
      <div class="form-group">
        <input type="button" value="Close" class="btn btn-primary btn-xs" ng-click="$parent.isPopoverOpen = false">
        <input type="button" value="Comment" class="btn btn-primary btn-xs pull-right" ng-click="saveComment(this)">
      </div>
    </form>
    <br>
  </div>
</script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-02
    • 2015-10-24
    • 1970-01-01
    • 2020-04-28
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    相关资源
    最近更新 更多