Flashhilfe.de - Flash Community

DispatchEvent in onload-Funktion des XML-Objekts [Flash 9]

 


AntwortenRegistrieren Seite1  

cellardoor#1
Benutzerbild von cellardoor
Beiträge: 43
Registriert: Sep 2007

14.08.2008, 09:20

Hallo,

ich habe ein Problem mit dem Auslösen eines Events in der onload-Funktion des XML-Objekts.

Vielleicht erstmal kurz zu der Funktionalität, die ich abbilden möchte. Unter Umständen gibt es ja einen eleganteren Ansatz als meinen.

In der Flash-Applikation sollen Daten aus einer DB eines CMS ausgelesen werden. Dies erfolgt mittels der sendAndLoad-Funktion des XML-Objekts.

Da an vielen Stellen der Flash-Applikation Texte aus der DB ausgelesen werden sollen, habe ich die Funktionalität des Auslesens in einer externen as-Datei gekapselt und als Klasse zur Verfügung gestellt.

In den jeweiligen Timeline-Skripten erstelle ich nun ein neues Objekt dieser Klasse, rufe die Funktion des Auslesens auf und möchte dann die ausgelesenen Daten verarbeiten.

Da das Auslesen der Daten eine gewisse Zeit in Anspruch nimmt, möchte ich nach erfolgreichem Auslesen ein Event auslösen, auf das ich reagieren kann.

Nun zu der von mir implementierten Lösung.

Timeline.Skript:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
classItem = new Cms();
classItem.pageid = "de3bd669-5d00-4f6e-9897-667b50dd5df5";
classItem.lc = "en";
var myListnerObj:Object = new Object();

myListnerObj.handleEvent = function(p_eventObj) {
   trace(p_eventObj.type+" from: "+p_eventObj.target);
}

classItem.addEventListener("load",myListnerObj);
classItem.GetData();


Datei cms.as:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import mx.events.EventDispatcher

class Cms{
   function dispatchEvent() {};
   function addEventListener() {};
   function removeEventListener() {};   

   public var eventObject:Object;
      
   private var _pageid;

   function set pageid(wert:String) {
      _pageid = wert;
     }
     function get pageid():String {
      return _pageid;
     }
   
   private var _isloaded;

   private var _lc;

   function set lc(wert:String) {
      _lc = wert;
     }
     function get lc():String {
      return _lc;
     }

   var datacontent = new Array();

   function EnprizeCms()
   {
      pageid="";
      lc="de";
      mx.events.EventDispatcher.initialize(this);
      eventObject= {target:this, type:'load'};
   }

   public function GetData()
   {
      var xmlQuery:String;
      var strKey:String;
      var strValue:String;
      xmlQuery = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>";
      xmlQuery += "<root><cms><id>";
      xmlQuery += this.pageid;
      xmlQuery += "</id><lc>";
      xmlQuery += this.lc;
      xmlQuery += "</lc></cms></root>";
      var my_xml:XML = new XML(xmlQuery);
      var myReply_xml:XML = new XML();
      myReply_xml.ignoreWhite = true;

      myReply_xml.onLoad = myOnLoad;
      my_xml.sendAndLoad("http://.../modules/cms/GetData.aspx", myReply_xml);
      function myOnLoad(success:Boolean) {
         if (success) {
            var _items = new Array();
            for(var i=0;i<myReply_xml.firstChild.childNodes.length;i++) {
               strKey = myReply_xml.firstChild.childNodes[i].nodeName;
               strValue = myReply_xml.firstChild.childNodes[i].firstChild;
               _items[strKey] = strValue;
            }
            this.datacontent = _items;
        dispatchEvent(eventObject);
         } else {
         }
      }
   }
}


Das Problem ist nun, dass das augelöste Event nicht erkannt wird. Wenn ich die Zeile dispatchEvent(eventObject); vor der XML-Funktion myOnLoad einfüge, wird das ausgelöste Event erkannt.

Any Ideas?

Besten Dank.

Cellardoor.
Werbung
Beiträge: 0
Registriert: Feb 2016


burnZ#2
Benutzerbild von burnZ
Beiträge: 2827
Wohnort: Bayern
Registriert: Aug 2005

14.08.2008, 09:43

Hier gilt selbiges wie im anderen Thread (http://flashhilfe.de/forum/actionscript-2-0/zugriff-auf-klassenvariablen-in-einer-setintervall-funktion-243600-243600.html). Mach myOnload zum Klassemember und erzeuge einen Delegaten.
Geändert von burnZ am 14.08.08 um 09:44 Uhr
omega psi#3
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

14.08.2008, 09:50

Vielleicht solltest du mal überlegen auf ActionScript 3 umzusteigen. Du nutzt mittlerweile ja die relaventen Mechanismen, die in ActionScript 3 aber konsequenter und konsistenter umgesetzt wurden.
Architectures - Refactoring - Prototyping - Coding - Training
cellardoor#4
Benutzerbild von cellardoor
Beiträge: 43
Registriert: Sep 2007

Themenautor/in

14.08.2008, 09:53

Das würde ich sehr gerne, da aber von den Designern einige Animationsskripte eingesetzt werden, die in AS3 nicht funktionieren, muss ich mich erstmal noch mit AS2 rumschlagen.
Werbung
Beiträge: 0
Registriert: Feb 2016


omega psi#5
Benutzerbild von omega psi
Beiträge: 791
Registriert: Apr 2004

14.08.2008, 09:58

Das tut mir leid...
Architectures - Refactoring - Prototyping - Coding - Training
cellardoor#6
Benutzerbild von cellardoor
Beiträge: 43
Registriert: Sep 2007

Themenautor/in

14.08.2008, 14:06

Hi,

jetzt funktioniert es auch mit den Events.

Falls es noch jemanden interessiert, hier der Code des Klassenskripts:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import mx.events.EventDispatcher
import mx.utils.Delegate;

class Cms{
   
   
   function dispatchEvent() {};
   function addEventListener() {};
   function removeEventListener() {};   

   public var eventObject:Object;
      
   var datacontent = new Array();
   public var myReply_xml:XML;
      
   function Cms()
   {
      mx.events.EventDispatcher.initialize(this);
      eventObject= {target:this, type:'load'};
      myReply_xml = new XML();
   }

   public function GetData()
   {
      var xmlQuery:String;
      xmlQuery = "...";
      var my_xml:XML = new XML(xmlQuery);
      myReply_xml.ignoreWhite = true;

      myReply_xml.onLoad = Delegate.create( this, myOnLoad);
      my_xml.sendAndLoad("http://.../modules/cms/GetData.aspx", myReply_xml);
   }
   
   public function myOnLoad(success:Boolean) {
      var strKey:String;
      var strValue:String;

      if (success) {
         trace(myReply_xml);
         var _items = new Array();
         for(var i=0;i<myReply_xml.firstChild.childNodes.length;i++) {
            strKey = myReply_xml.firstChild.childNodes[i].nodeName;
            strValue = myReply_xml.firstChild.childNodes[i].firstChild;
            _items[strKey] = strValue;
         }
         this.datacontent = _items;
         this.isloaded = true;
               dispatchEvent(eventObject);
      } else {
         //gotoAndStop("connectionFailed");
      }
   }
}


Wichtigste Änderung:

myReply_xml.onLoad = Delegate.create( this, myOnLoad);

und die Funktion myOnLoad wurde ein Klassenmember. So wie auch vorgeschlagen.

Besten Dank

Cellardoor.
Geändert von cellardoor am 14.08.08 um 14:06 Uhr

AntwortenRegistrieren Seite1  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Partner Webseiten: art-and-law.de  Mediengestalter.info   php-resource.de   phpforum.de   phpwelt.de   Pixelio.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Hier Werben   Impressum
© 1999-2020 Sebastian Wichmann - Flashhilfe.de