2013-12-10 101 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); 
}; 

工廠找到正確的位置和加入的節點。

當添加一個孩子到有現有孩子的節點時,它添加了兩個孩子,我不明白爲什麼。

感謝。

編輯 我可以失去has_children,它仍然產生相同的結果

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

EDIT 2 DROP掉的for循環,以及 - 只是交換引用,除了函數e,執行兩次!

updated JSBIN

+0

這是沒有答案,但在 「add_children_element()」你正在調用「scope.has_children = true;」和「add_task()」。 檢查你是否沒有在你的DataFactory中重複這個錯誤,並嘗試記錄(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

現在看起來很明顯!謝啦。非常讚賞。 – haki

+1

我正在盯着這個jsbin,試圖弄清楚發生了什麼。 +1。 – ivarni