2014-02-20 1 views
2

Я создал директиву для определения угла, когда ng-repeat завершен. Я нашел наиболее распространенное решение - это что-то вроде here - Calling a function when ng-repeat has finishedУгловая директива для финиша ng-repeat, когда элементы сплайсинга()

Но почему директива запускается только при добавлении элемента, но не при удалении?

Here - ng-repeat list in Angular is not updated when a model element is spliced from the model array Я видел некоторые предложения о принятии $ сферу. $ Применяется, но по-прежнему не работает, потому что он говорит: «$ применять уже в процессе»

Я создал here - a Plunker, где вы можете воспроизвести его.

Большое спасибо !!!

ответ

4

Причина, по которой директива работает при добавлении элемента в коллекцию, заключается в том, что функция ссылки вызывается, когда каждый повторный элемент добавляется в dom. Это отлично работает, когда коллекция отображается в первый раз и когда элемент добавляется в конец коллекции. Он не работает, когда элемент добавляется в другом месте коллекции, например. в начале, поскольку функция ссылки вызывается для нового элемента, но $ last будет false.

Когда элемент удален из коллекции, директива не создается и, следовательно, не вызывается функция ссылки.

Чтобы получить то, что вы хотите, вы можете создать часы на сбор и выполнять все, что вы хотите сделать в $ тайм-аут, так что это будет сделано после того, как делают:

$scope.$watchCollection('ta', function(){ 
    $timeout(function(){ 
     // the collection has rendered so do all my whizzy stuff 
    }); 
}); 
0

Скорее всего, это потому, что ng-repeat не перебирает весь массив, когда предмет сплайсирован. Он просто удаляет этот элемент из массива и удаляет связанный узел DOM.

Я не знаю, чего именно вы пытаетесь достичь, но если вам нужно отреагировать на изменения в списке ng-repeat, почему бы вам просто не смотреть на массив вместо этого?

+0

Благодаря @Harijs, я использую директива вместо $ watch, потому что $ watch запускается перед рендерингом. Мне нужно изменить размер элемента, когда рендеринг элементов ng-repeat закончен. –

+0

Ну, если вы хотите избежать начального триггера, вы можете настроить свою функцию $ watch по-другому, например. как это показано на самом деле (http://docs.angularjs.org/api/ng/type/$rootScope.Scope) '$ scope. $ watch ('myvar', function (newValue, oldValue) { if (newValue! == oldValue) { // сделайте свою вещь }); ' –

+0

Я не имею в виду начальный триггер. Я имею в виду, что когда я делаю array.push(), сначала он запускает часы, а затем визуализируется новый элемент (что делает весь смысл). Но мне нужно вызвать функцию resize(), когда были отображены все элементы ng-repeat. –

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