Angular JS:为什么我的点击事件会触发两次
Angular JS: Why is my click event firing twice?
我有以下代码。它在JSON上循环以生成嵌套的ul列表。我有一个点击事件,它执行绑定到锚标记的函数toggleNav()。我不知道为什么click事件绑定到元素两次。此外,我对angular还很陌生,有没有一份文件可以解释这个概念?谢谢
define([
'/assets/angularapp/AppDirectives.js',
'highstock'
], function (directives) {
directives.directive('collection', function () {
return {
restrict: "E", //declare by element
replace: true,
scope: {
collection: '='
},
template: "<ul class='"nav nav-list tree'"><member ng-repeat='"member in collection'" member='"member'"></member></ul>"
}
})
directives.directive('member', function ($compile) {
return {
restrict: "E",
replace: true,
scope: {
member: '='
},
template: "<li ng-show='"member.open'"><span><input type='"checkbox'" ng-model='"member.selected'" class='"sideChkbox'"><a class='"tree-toggle'" ng-click='"toggleNav()'"><i class='"icon-chevron-right'"></i>{{member.data}}</a></span></li>",
controller: function($scope, $element){
$scope.toggleNav = function(){
angular.forEach($scope.member.children,function(child,key){
if(child.open==true){
alert("a")
child.open=false;
} else {
child.open=true;
alert("b")
}
})
}
},
link: function (scope, element, attrs) {
if (angular.isArray(scope.member.children)) {
element.append("<collection collection='member.children'></collection>");
$compile(element.contents())(scope)
}
}
}
})
这是因为您正在编译元素.contents(),包括<a>使用ng-click,应该已经编译好了。当您调用手动编译时,它会再次被编译。
你可以通过这个来修复它:
...
if (angular.isArray(scope.member.children)) {
var newMemEL = angular.element("<collection collection='member.children'></collection>");
element.append(newMemEL);
$compile(newMemEL)(scope);
}
...
看起来你正在尝试创建一个树视图,在这种情况下,最好使用ngInclude,而不是创建自定义指令,看看这个plunker,注意,由于这个问题,它将不适用于Angular 1.2.0rc1。
@DucNguyen先生的答案是正确的,但如果您不想进一步操纵DOM,您可以用另一种方法来处理它。
在链接功能期间将元素标记为已完成,因此当它尝试再次链接时会失败。
link: function (scope, element, attrs) {
// stop an already linked element from continuing
if (element.attr('collection-linked')) {
return;
}
// otherwise, add a completed flag to this element
element.attr('collection-linked', true);
// continue your linking ...
}
相关文章:
- Jquery点击事件必须点击两次
- 一次点击,两次'单击'事件已启动
- 替换的超时事件触发两次或两次以上(有时)
- jquery on触发器按键事件两次
- 骨干视图触发事件两次
- animationEnd 事件处理程序 - 事件侦听两次
- 触发的事件被接收两次.如何找到鬼视图
- 服务器触发客户端事件两次
- `object:selected`事件触发两次
- 如何处理iframe中两次或根本不触发的IE11 localStorage事件
- 谷歌地图api v3 zoom_changed事件在fitBounds调用后激发了两次
- 为什么主干视图触发更改事件两次
- 如何防止在快速单击时两次调用en事件处理程序
- jQuery点击事件触发两次
- 为什么事件mouseenter在JavaScript中触发两次
- 在具有单击事件的 li 内时停止选中两次复选框
- 引导模式切换事件发生两次
- j查询点击事件触发两次
- 骨干模型触发“变化”.两次事件
- 在父元素具有相同事件函数的子元素上单独触发两次事件函数