2013-12-10 3 views
7

У меня есть древовидная структура. JSBIN hereПочему эта функция выполняется дважды?

в директиве

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); 
}; 

Завод найти правильное положение и добавление узла.

При добавлении ребенка в узлы с существующими детьми он добавляет двух детей, и я не понимаю, почему.

Спасибо.

EDIT я могу потерять has_children и она по-прежнему дает тот же результат, связь

updated JSBIN

Член functin

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); 
      }; 
     } 

EDIT 2 падает на порядок для петель, а также - просто обмениваясь ссылками, ничего не оставалось, кроме функции e вырезано дважды!

updated JSBIN

+0

Это не ответ, но в "add_children_element()" вы вызываете «scope.has_children = true;», а также в «add_task()». Проверьте, не повторили ли вы эту ошибку в DataFactory и попробуйте log (console.log), что именно делает код. – Neozaru

+0

Я считаю, что вы хотите 'this' внутри первого тела функции, а не' scope' –

+0

@Mark Reed - не могли бы вы объяснить? 'это' вместо чего? – haki

ответ

3

Вы собираете весь элемент (включая часть добавленной шаблоне директивы, который уже был составлен):

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); 

updated jsbin

+0

кажется так obviouse сейчас! Спасибо чувак. много признательность. – haki

+1

Я смотрел на этот jsbin целую вечность, пытаясь понять, что происходит. +1. – ivarni

Смежные вопросы