2013-09-06 39 views
14

Tôi tiếp tục gặp lỗi này trong chương trình khi tôi tiêu diệt phạm vi của riêng mình. Tôi theo dõi nó xuống để lặp trong khi điều này trong góc:

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

Tôi cũng đã quản lý để tái tạo nó trong một jsFiddle: http://jsfiddle.net/kEyqz/1/

Đó là khá dễ dàng để thiết lập, trên một yếu tố tôi dây lên một nhấp chuột sự kiện và sau đó $ phát sóng rằng nó đã được nhấp theo sau là một $ áp dụng.

Trong một chỉ thị riêng biệt (với phạm vi con) tôi nghe trong sự kiện đó, và nếu tôi nhìn thấy nó, tôi phá hủy phạm vi con. Làm như vậy tạo ra lỗi:

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

Đây chỉ là một ví dụ nhỏ về những gì tôi đang cố gắng hoàn thành trong mã của mình.

Điều khiển ghi nhật ký ngay trước current = current. $ Parent kết quả trong phạm vi không có $ parent (được đặt thành null).

tôi có thể thêm các dòng:

if(!current){ 
    break; 
} 

Sau khi dòng điện = hiện tại $ cha mẹ, nhưng tôi sẽ phải duy trì nó nếu tôi chuyển sang phiên bản góc (không lý tưởng)

+0

Dường như là một lỗi đã biết: https://github.com/angular/angular.js/issues/1627 –

+3

Lỗi đó được đánh dấu cố định cách đây 9 tháng và câu hỏi này là về một vấn đề vẫn xảy ra với Angular 1.0 hiện tại .số 8. – metamatt

+1

Bạn có thấy vấn đề này phá hủy phạm vi của chính bạn mà bạn đã tạo ra không? Ví dụ trong jsFiddle của bạn là phá hủy một phạm vi mà Angular tạo ra cho chỉ thị của bạn. Nếu tôi thay đổi nó để tạo ra và sau đó phá hủy một phạm vi khác nhau, tôi không thấy vấn đề này. http://jsfiddle.net/kEyqz/2/ – metamatt

Trả lời

17

Đây có phải là những gì. bạn đang tìm kiếm http://jsfiddle.net/jw99Lj7t/?

Bạn đã $destroy 'ing $scope durgin digest cycle - đã gây ra lỗi.

Tôi không tin rằng đây là bug vì đây là cách thực hiện chu kỳ digest (vòng lặp qua danh sách $scopes kiểm tra xem có gì thay đổi không và chúng tôi không thể xóa phạm vi khỏi danh sách đó "đã được sử dụng").

Giải quyết vấn đề này, có thể giới thiệu rất nhiều phức tạp và vì digest phải rất nhanh, tốt hơn là chỉ tìm cách khác cho điều bạn đang làm.

+0

Đó là một trường hợp cuối cùng. Tôi đã có đoạn mã như là một failsafe hiện nay. –

+1

@MathewBerg Trường hợp cuối cùng, tôi nghĩ bạn sẽ thấy đây là cách duy nhất, tôi đã gặp lỗi này nhiều lần và vấn đề thực tế là bạn đã phá hủy phạm vi nhưng góc cạnh vẫn đang làm việc với phạm vi đó và nghĩ rằng vẫn tồn tại để kiểm tra giá trị của nó trên đó. 'setTimeout' là cách duy nhất, nó đảm bảo góc được hoàn thành trước khi bạn phá hủy phạm vi. @ g00fy trong bản demo của bạn, bạn đang sử dụng 'setTimeout' nhưng bạn chưa đề cập đến nó ở bất kỳ đâu trong mã của bạn, ** + 1 ** nếu bạn làm vậy. – iConnor

+1

Giải pháp của tôi sử dụng thời gian chờ $ thay vào đó, nhưng về cơ bản giống nhau. –

Các vấn đề liên quan