2014-02-21 3 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); 

Я m, используя lodash (_), чтобы найти различия между новыми и старыми элементами. Проблема newItems и oldItems всегда одинаковы даже после того, как новые элементы будут перенесены в массив myItems родительской области. Что мне не хватает?

+0

Вы пробовали перебирать себя и видеть, что на самом деле содержится в каждой переменной? –

+0

Да, после push, newItems и oldItems содержат помещенные элементы. – synergetic

+0

Может быть, функция называется много раз? –

ответ

0

Как сказал Грун Банни в комментариях, это открытая проблема с 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, но это был мой способ принудительно использовать «родительский элемент». В любом случае, надеюсь, это поможет некоторым!

Edit - Это действительно раздражает меня, сколько раз эта директива была запущена в нг-повторе, так что я написал еще plunker (http://plnkr.co/edit/R9hQpRZqrAQoCPdQu3ea?p=preview), который использует один нг-повтор:

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

Это только дважды вызывает директиву (почему дважды, я все еще не уверен).

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