事件侦听器在 ng-repeat 中消失
Event listener disappears inside ng-repeat
我的 HTML 表单有很多问题是我使用 ng-repeat 创建的。
我想为一些问题创建一个弹出窗口。
当我将触发弹出窗口的按钮放在 ng-repeat 之外时,它起作用了。在 ng-repeat 里面它没有。
这个有效(ng-repeat 之前的按钮):
<div class="row">
<div class="col-md-12">
<button title="" data-toggle="popover" data-placement="top" data-trigger="hover" data-title="Popover on hover" data-content="And here's some amazing content. It's very engaging. Right?" class="btn btn-primary btn-wide">
hover
</button>
<div ng-repeat="q in config.questionnaire.questions">
制作这个:
这不起作用(ng-repeat 后的按钮):
<div class="row">
<div class="col-md-12">
<div ng-repeat="q in config.questionnaire.questions">
<button title="" data-toggle="popover" data-placement="top" data-trigger="hover" data-title="Popover on hover" data-content="And here's some amazing content. It's very engaging. Right?" class="btn btn-primary btn-wide">
hover
</button>
检查 google chrome 上的按钮元素,我发现一些事件侦听器已被删除:
这些是 ng-repeat 之前按钮的事件侦听器:
这些是 ng-repeat 之后按钮的事件侦听器:
如您所见,鼠标悬停和鼠标移出侦听器消失了。
为什么?
我能做什么?
如果您在 Angular 项目中使用 Bootstrap,请考虑使用 Angular UI 库。
https://angular-ui.github.io/bootstrap/#/popover
它提供了许多指令,可以更轻松地将 Bootstrap 与 Angular 连接起来。我用 ng-repeat
测试了 uib-popover
指令,它以这种方式正常工作。代码非常简单:
//...
<div ng-repeat="t in main.testArray">
<button uib-popover="My popover content" popover-title="Popover title" popover-trigger="mouseenter">{{t.text}}</button>
</div>
//...
我会尝试进一步调查您的问题,但图书馆似乎是一个简单的解决方法。
编辑
我想我也想出了一个不使用外部库的解决方案。我所做的是创建一个指令,该指令在指定元素上初始化 Boostrap 弹出窗口。这样你就可以确保 popover
函数在渲染元素时被触发。我想这就是为什么它不适用于您的方法的原因。您可能在元素真正呈现之前调用了 popover
函数,因为 ng-repeat
会延迟执行此操作。
这是代码:
angular.module('moduleName')
.directive('bootstrapPopover', function() {
return {
restrict: 'A',
link: function (scope, element, attrs) {
element.popover();
}
};
});
然后在元素上使用指令:
<div ng-repeat="t in main.test">
<button data-toggle="popover" data-placement="top" data-trigger="hover" data-title="Test" data-content="Test"
class="btn btn-primary btn-wide" bootstrap-popover>hover {{t.text}</button>
</div>
但是,我仍然建议尝试 Angular UI。我在上一个 Angular 项目中使用了它,它真的很有帮助。
我的 HTML 表单有很多问题是我使用 ng-repeat 创建的。 我想为一些问题创建一个弹出窗口。 当我将触发弹出窗口的按钮放在 ng-repeat 之外时,它起作用了。在 ng-repeat 里面它没有。
这个有效(ng-repeat 之前的按钮):
<div class="row">
<div class="col-md-12">
<button title="" data-toggle="popover" data-placement="top" data-trigger="hover" data-title="Popover on hover" data-content="And here's some amazing content. It's very engaging. Right?" class="btn btn-primary btn-wide">
hover
</button>
<div ng-repeat="q in config.questionnaire.questions">
制作这个:
这不起作用(ng-repeat 后的按钮):
<div class="row">
<div class="col-md-12">
<div ng-repeat="q in config.questionnaire.questions">
<button title="" data-toggle="popover" data-placement="top" data-trigger="hover" data-title="Popover on hover" data-content="And here's some amazing content. It's very engaging. Right?" class="btn btn-primary btn-wide">
hover
</button>
检查 google chrome 上的按钮元素,我发现一些事件侦听器已被删除:
这些是 ng-repeat 之前按钮的事件侦听器:
这些是 ng-repeat 之后按钮的事件侦听器:
如您所见,鼠标悬停和鼠标移出侦听器消失了。
为什么?
我能做什么?
如果您在 Angular 项目中使用 Bootstrap,请考虑使用 Angular UI 库。
https://angular-ui.github.io/bootstrap/#/popover
它提供了许多指令,可以更轻松地将 Bootstrap 与 Angular 连接起来。我用 ng-repeat
测试了 uib-popover
指令,它以这种方式正常工作。代码非常简单:
//...
<div ng-repeat="t in main.testArray">
<button uib-popover="My popover content" popover-title="Popover title" popover-trigger="mouseenter">{{t.text}}</button>
</div>
//...
我会尝试进一步调查您的问题,但图书馆似乎是一个简单的解决方法。
编辑
我想我也想出了一个不使用外部库的解决方案。我所做的是创建一个指令,该指令在指定元素上初始化 Boostrap 弹出窗口。这样你就可以确保 popover
函数在渲染元素时被触发。我想这就是为什么它不适用于您的方法的原因。您可能在元素真正呈现之前调用了 popover
函数,因为 ng-repeat
会延迟执行此操作。
这是代码:
angular.module('moduleName')
.directive('bootstrapPopover', function() {
return {
restrict: 'A',
link: function (scope, element, attrs) {
element.popover();
}
};
});
然后在元素上使用指令:
<div ng-repeat="t in main.test">
<button data-toggle="popover" data-placement="top" data-trigger="hover" data-title="Test" data-content="Test"
class="btn btn-primary btn-wide" bootstrap-popover>hover {{t.text}</button>
</div>
但是,我仍然建议尝试 Angular UI。我在上一个 Angular 项目中使用了它,它真的很有帮助。