2013-07-06 46 views
5

Tôi thực sự là lý do tại sao điều này xảy ra. Tôi đã tạo ra hai vật thể. Một là con của người khác. Tôi đã đăng ký cả với trình xử lý sự kiện ADDED_TO_STAGE. Phương thức onAdded trong classB được thực hiện hai lần.Sự kiện ADDED_TO_STAGE đã thực hiện nhiều lần hơn as3

Tại sao điều này xảy ra và làm cách nào để ngăn chặn hành vi này?

thanx cho câu trả lời

public class ClassA extends Sprite 
{ 
     public function ClassA() 
     { 
      this.addEventListener(Event.ADDED_TO_STAGE, onAdded); 
     } 

     private function onAdded(e:Event):void 
     { 
      trace("ON ADDED 1"); 
      var classB : ClassB = new ClassB(); 
      addChild(classB); 
     } 
} 

public class ClassB extends Sprite 
{ 
     public function ClassB() 
     { 
      this.addEventListener(Event.ADDED_TO_STAGE, onAdded); 
     } 

     private function onAdded(e:Event):void 
     { 
      trace("ON ADDED 2"); 
     } 
} 

OUTPUT: VỀ TĂNG 1 VỀ TĂNG 2 VỀ TĂNG 2

Trả lời

9

Từ here: Có hai sự kiện tương tự:

Event.ADDED_TO_STAGE 
Event.ADDED 

Có sự khác biệt giữa chúng:

THÊM

được cử khi DisplayObject nghe được thêm vào một DisplayObject (không có vấn đề nếu nó là một đối tượng Stage hay không). Nó cũng được gửi đi nếu bất kỳ DisplayObject nào khác được thêm vào DisplayObject nghe.

ADDED_TO_STAGE

được cử khi DisplayObject nghe được thêm vào giai đoạn HOẶC đến bất kỳ DisplayObject khác được bổ sung vào sân khấu.


Trong trường hợp của bạn nó công văn hai lần:

1) ClassB được thêm vào ClassA rằng đã thêm vào Stage.

2) ClassB được thêm vào Giai đoạn.

Đó là API cấp thấp. Bạn có thể cung cấp logic tùy chỉnh trong trường hợp của .parent là Stage hay không. Về cơ bản, bạn biết điều đó, bạn không thực sự cần phải nghe điều này và bạn có thể gọi:

this.removeEventListener(Event.ADDED_TO_STAGE, onAdded); 

để tránh gọi điệnThêm hai lần.

Một cách khác để ngăn chặn điều đó sẽ bổ sung ClassB trong khi xây dựng classA:

private classB:ClassB = new ClassB(); 
public function ClassA() 
{ 
    addChild(classB); 
    this.addEventListener(Event.ADDED_TO_STAGE, onAdded); 
} 
+0

cảm ơn mẹ đã dạy tôi điều gì đó :) mới – Riddlah

0

Đó là vì sự kiện bọt.

Bạn nên loại bỏ các event listener lần onAddedToStage được gọi là, do đó tuyên bố đầu tiên bên trong:

private function onAdded(e:Event):void 

nên

removeEventListener(Event.ADDED_TO_STAGE, onAdded); 
Các vấn đề liên quan