2014-02-21 70 views
2

我建立自定義樹指令:Angularjs 1.2.6:手錶指令的父範圍收集

<ul tree="treeOptions"> 
    <li>{{ item.code + ' - ' + item.name }}</li> 
</ul> 

在javascript中:

$scope.myItems = []; 
$scope.treeOptions = { 
    data: 'myItems', 
    ... 
} 

在指令:

(function (angular) { 
    'use strict'; 

    angular.module('tree', []). 
     directive('tree', ['$compile', '$document', function ($compile, 
                   $document) { 
      return { 
       restrict: 'A', 
       scope: { treeOptions: '=tree' }, //Isolated scope 
       compile: function (elem, attrs) { 

        //... 

        return function (scope, elem, attrs) { 

         //... 

         scope.$parent.$watchCollection(scope.treeOptions.data, 
          function (newItems, oldItems) { 
           var addedItems = _.difference(newItems, oldItems); 
           var removedItems = _.difference(oldItems, newItems); 
           //but newItems and oldItems always the same 

           //... 
          } 
         );  
        }   
       }; 
      } 
     }; 
    } ]); 
})(angular); 

我使用lodash(_)來找出新舊項目之間的差異。 問題是newItems和oldItems總是相同的,即使將新項目推送到父作用域的myItems數組後。我錯過了什麼?

+0

您是否試過循環瀏覽自己,看看每個變量中實際包含的內容? –

+0

是的,推後,newItems和oldItems都包含推送的項目。 – synergetic

+0

也許功能被稱爲無數次? –

回答

0

正如Gruff Bunny在評論中指出的那樣,這是AngularJS直到當前版本(1.2.13)的一個公開問題。現在的解決方法是使用$watch(, true)或按drew_w建議。

2

所以,這在角度框架中肯定是一個問題。我相信他們會盡快解決它,但同時如果你需要讓你的代碼工作,我可以把一個很好的樣本放在一起。其核心是不使用默認的舊/新元素:

var oldWorkingItems = scope.$parent[attrs.testDirective].slice(0); 
    scope.$parent.$watchCollection(attrs.testDirective, 
     function (newItems, oldItems) { 
     console.log('NEW Items:' + newItems); 
     console.log('Old Items:' + oldWorkingItems); 

對於完整的示例,以及我的錯誤重現,請參閱以下Plunkr:http://plnkr.co/edit/R9hQpRZqrAQoCPdQu3ea?p=preview。順便說一句,這個被稱爲很多次的原因是因爲它在ng-repeat內,但這是我強制使用「$ parent」的方法。無論如何,希望這有助於一些!

編輯 - 這真的惹惱了我多少次的指令是在NG-重複正在運行,所以我寫了使用單一NG重複另一個plunker(http://plnkr.co/edit/R9hQpRZqrAQoCPdQu3ea?p=preview):

<div ng-repeat="element in [1]"> 
    <div test-directive="testCollection"></div> 
</div> 

這隻調用指令兩次(爲什麼兩次,我還不確定)。