我有以下代码。它循环遍历JSON以生成嵌套的ul列表。我有一个click事件,它执行绑定到锚标记的函数toggleNav()。我不知道为什么click事件被绑定到元素两次。另外我是棱角分明的新手,是否有一个文件可以解释这个概念?谢谢!
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)
}
}
}
})
答案 0 :(得分:13)
这是因为你正在编译element.contents(),包括&lt; a&gt;使用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,注意它会由于此issue
,无法使用Angular 1.2.0rc1答案 1 :(得分:2)
@ Mr.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 ...
}