2013-04-12 37 views
15

Tôi đoán điều này có nghĩa là có một tham chiếu vòng tròn, nhưng đối với cuộc sống của tôi, tôi không thể đoán được cách khắc phục nó.RangeError: Kích thước ngăn xếp cuộc gọi tối đa vượt quá

Bất kỳ ai có ý tưởng nào?

http://plnkr.co/edit/aNcBcU?p=preview

Kiểm tra debug console trong Chrome (ví dụ) và bạn sẽ thấy lỗi. Dòng vi phạm là

scope.map = map; 

scope.map đang được "$ theo dõi" trên bộ điều khiển qua

$scope.$watch("options.map", function (map) { ... }, true); 

Trả lời

16

Đó là bởi vì bạn đang so sánh cho đối tượng cho sự bình đẳng chứ không phải là để tham khảo. Thay đổi tuyên bố $watch của bạn về điều này:

$scope.$watch("options.map", function (map) { 
    if (map === undefined) { 
     alert("map has no value"); 
    } else { 
     alert("map is defined"); 
    } 
}); 
+10

Cảm ơn bạn! Chỉ dành cho những người khác có thể cần câu trả lời này. Tôi đoán lý do này không thành công là đối tượng đang được thử nghiệm là một đối tượng có nhiều thuộc tính làm tổ sâu sắc? Tại sao thử nghiệm bình đẳng trên đối tượng này làm cho kích thước ngăn xếp vượt quá thông báo? – thrag

8

Tôi cũng gặp vấn đề này và phát hiện ra rằng các đối tượng tôi so sánh có tham chiếu vòng tròn. (Đã thử JSON.stringify() đã ném 'TypeError: Chuyển đổi cấu trúc hình tròn thành JSON').

Khi tôi chỉnh sửa đối tượng sao cho nó không có cấu trúc hình tròn, tôi đã khắc phục vấn đề này và so sánh các đối tượng không theo tham chiếu mà theo giá trị thuộc tính là thứ tôi cần.

5

Tham số thứ ba của hàm $ watch cho biết cách so sánh đối tượng đã xem. False để chỉ so sánh tham chiếu. Đúng để so sánh bình đẳng đệ quy, nếu đối tượng chứa tham chiếu vòng tròn, sau đó vượt quá kích thước chồng tối đa. Ví dụ:

var a = {ref:b}; 
var b = {ref:a}; 
$scope.$watch('b', function(){ 
    //code here will never called, because stack overflow when comparing the object b. 
}, true) 
Các vấn đề liên quan