为什么这个函数执行了两次

Why is this function executed twice?

本文关键字:两次 函数 执行 为什么      更新时间:2023-09-26

我有一个树结构。JSBIN此处

在指令中

scope.add_child_task = function() {
    scope.add_task(scope.path,"child of " + scope.member.name);
    if (!scope.has_children) {
        scope.add_children_element();
        scope.has_children = true;
    }
};

在控制器中

$scope.add_task = function(to,name) { 
    DataFactory.add_task(to,name);
};

工厂正在查找正确的位置并添加节点。

当将一个子节点添加到具有现有子节点的节点时,这是在添加两个子节点,我不明白为什么

谢谢。

编辑我可以失去has_children,它仍然产生相同的结果

更新的JSBIN

成员链接函数

link: function (scope, element, attrs) {            
            element.append("<collection></collection>"); 
            $compile(element.contents())(scope);
            scope.get_path = function() { 
                var temp = scope.$parent.get_path();
                temp.push(scope.member.name);
                return temp;
            };
            scope.path = scope.get_path();
            scope.add_child_task = function() {
                scope.add_task(scope.path,"child of " + scope.member.name);
            };
        }

编辑2也删除了for循环——只是交换引用,只剩下一个执行了两次的函数!

更新的JSBIN

您正在编译整个元素(包括指令模板添加的部分,该部分已经编译):

element.append("<collection></collection>"); 
$compile(element.contents())(scope);

由于您的点击处理程序在模板中,所以第二次编译模板会导致添加第二组点击处理程序(以及其他内容)。

template: "<li>{{member.name}}" + 
      " <i>{{path}}</i> <a href ng-click='add_child_task()'>Add Child</a></li>",

修复:相反,使用它只编译您添加的新元素:

newe = angular.element("<collection></collection>");
element.append(newe); 
$compile(newe)(scope);

更新的jsbin