2013-09-06 23 views
14

Ciągle pojawia się ten błąd w moim programie, gdy niszczę własne obszary. Śledziłem go do tej pętli while wewnątrz kanciasty:

if (!(next = (current.$$childHead || (current !== target && current.$$nextSibling)))) { 
    while(current !== target && !(next = current.$$nextSibling)) { 
     current = current.$parent; 
    } 
} 

udało mi także replikować go w jsFiddle: http://jsfiddle.net/kEyqz/1/

Jest to dość łatwy do skonfigurowania, na elemencie I drut kliknięcie zdarzenie, a następnie $ broadcast, że zostało kliknięte, a następnie $ apply.

W osobnej dyrektywie (z zakresem podrzędnym) słucham tego wydarzenia, a jeśli je zobaczę, niszczę zakres podrzędny. Powoduje to wystąpienie błędu:

Uncaught TypeError: Cannot read property '$$nextSibling' of null 

To tylko mały przykład tego, co próbuję osiągnąć w moim kodzie.

Rejestrowanie konsoli tuż przed bieżącym = bieżącym. $ Parent powoduje, że zakres nie ma wartości $ parent (jest ustawiony na wartość null).

mogę dodać linie:

if(!current){ 
    break; 
} 

Po bieżącego = bieżący $ rodzica, ale chciałbym mieć ją utrzymać, jeśli mogę przełączyć kątowe wersje (nie idealne)

+0

Wydaje się być znanym błędem: https://github.com/angular/angular.js/issues/1627 –

+3

Ten błąd został oznaczony jako naprawiony 9 miesięcy temu i to pytanie dotyczy problemu, który wciąż ma miejsce w bieżącym Angular 1.0 .8. – metamatt

+1

Czy widzisz ten problem, niszcząc swoje własne zakresy, które sam stworzyłeś? Przykład w twoim jsFiddle niszczy zakres stworzony przez Angular dla twojej dyrektywy. Jeśli zmienię to, aby utworzyć, a następnie zniszczyć inny zakres, nie widzę tego problemu. http://jsfiddle.net/kEyqz/2/ – metamatt

Odpowiedz

17

Czy tego. szukałeś http://jsfiddle.net/jw99Lj7t/?

Użytkownik był $destroy "z cyklu $scope Durgin digest - który był przyczyną błędu.

ja nie wierzę, że jest to bug ponieważ jest to w jaki sposób realizowany jest cykl digest (to pętle na liście $scopes sprawdzenie, czy coś się zmieniło, i nie możemy usunąć zakresy z tej listy, jak to jest "już w użyciu").

Rozwiązanie tego problemu może wymagać wielu komplikacji, a ponieważ digest musi być bardzo szybkie, lepiej po prostu znaleźć inny sposób na to, co robisz.

+0

To jest ostatni przypadek. Mam już ten fragment kodu jako obecnie bezpieczny. –

+1

@MathewBerg Ostatni przypadek, myślę, że przekonasz się, że to jedyny sposób, wiele razy spotkałem się z tym błędem, a faktycznym problemem jest to, że zniszczyłeś zakres, ale kątowy nadal działa z tym zakresem i myśli, że nadal istnieje, więc sprawdza wartości na nim. 'setTimeout' jest jedynym sposobem, który upewnia się, że kąt jest zakończony, zanim zniszczysz zakres. @ g00fy w twojej demonstracji używasz 'setTimeout', ale nie wspominałeś o tym w żadnym miejscu w kodzie, ** + 1 ** jeśli to zrobisz. – iConnor

+1

Moje rozwiązanie używa zamiast tego opcji $ timeout, ale w zasadzie to samo. –

Powiązane problemy