• beyond tellerrand – play. Register Now!
Zurück   Flashforum > Flex und AIR > Flex programmieren

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 20-11-2008, 19:43   #1 (permalink)
Neuer User
 
Registriert seit: Mar 2003
Ort: Frankfurt
Beiträge: 32
Event Listener ohne Referenzen

Hallo Leute!

Bevor ich mir den Mund fusselig rede habe ich mal meine Struktur (in Photoshop) nachgebaut.

Beim change einer der MediaListen soll in der mediaStage ein neues MediaType angelegt werden.

Beim change Event in einer der Listen (z.T. dynamisch generiert) dispatche ich einen eigen definierten Event. Damit ich meinen Listener nicht an jeder MediaList anmelden muss, setzte ich bubbles=true. Wie kommt nun die MediaStage an das Event?
Code:
Application.application.furtherStage.addEventListener(CallNewMediaEvent.CALL_NEW_MEDIA, validateMediaEvent);
Das funktioniert zwar, aber schon beim Lesen dürften sich einige Mägen umdrehen.

Das ist mein großes Problem! Könnt ihr mir helfen?

vielen Dank, Ulli
ullim ist offline   Mit Zitat antworten
Alt 20-11-2008, 19:47   #2 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.856
Wo werden sie denn generiert?
Omega Psi ist offline   Mit Zitat antworten
Alt 20-11-2008, 19:55   #3 (permalink)
Neuer User
 
Registriert seit: Mar 2003
Ort: Frankfurt
Beiträge: 32
Achso... in der Component MediaList (diese ist ein Canvas) liegt eine Liste.
Code:
<mx:List id="liste" 
    	dataProvider="{listData}"
    	itemRenderer="views.FurtherMedia" 
    	change="listChanged(event)"...
Code:
private function listChanged(event:ListEvent):void
{
	var myEvent:CallNewMediaEvent = new CallNewMediaEvent(CallNewMediaEvent.CALL_NEW_MEDIA);
	//weitere definitionen
	dispatchEvent(myEvent);
}
ullim ist offline   Mit Zitat antworten
Alt 20-11-2008, 20:29   #4 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.856
Ist das alles in einer Datei? Dann vergib doch ids. Dann kannst du direkt referenzieren.
Omega Psi ist offline   Mit Zitat antworten
Alt 20-11-2008, 20:35   #5 (permalink)
Neuer User
 
Registriert seit: Mar 2003
Ort: Frankfurt
Beiträge: 32
Das CallNewMediaEvent wird aus der Komponente MediaList verschickt - diese liegt in der Komponente furtherStage (im Bild heißt sie fälschlicherweise listStage). Diese liegt auf der Application. Die Komponente die das Event empfangen soll MediaStage liegt auch auf der Application.

edit: im Bild sind die Komponenten mit < > gekennzeichnet

Geändert von ullim (20-11-2008 um 20:37 Uhr) Grund: hatte was vergessen
ullim ist offline   Mit Zitat antworten
Alt 20-11-2008, 20:40   #6 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.856
Sorry, ich verstehe das gerade nicht?! Kannst du nicht die mxml Strucktur posten?
Omega Psi ist offline   Mit Zitat antworten
Alt 20-11-2008, 21:02   #7 (permalink)
Neuer User
 
Registriert seit: Mar 2003
Ort: Frankfurt
Beiträge: 32
Hehe ok ich versuchs:

Application:
Code:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"  
	xmlns:views="views.*">
	
	<mx:HBox width="100%" horizontalGap="0" height="100%">
		<mx:VBox id="vBox" height="100%" width="100%" verticalGap="0" horizontalAlign="left" verticalAlign="top">
			<mx:Image source="@Embed('assets/header.gif')" />
			<views:MediaStage id="mediaStage" />
		</mx:VBox>
		<views:FurtherStage id="furtherStage" height="100%" width="100%"  borderStyle="none" verticalGap="0" paddingTop="0"/>
	</mx:HBox>

	<mx:Label text="version 006 - Rapid Prototyping - hard couppling events" />
</mx:Application>
MediaStage:
Code:
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml"
	creationComplete="init()">
	
	<mx:Script>
		<![CDATA[
			import mx.core.Application; //direkte Refferenz - muss noch weg
			import events.CallNewMediaEvent;

			private function init():void
			{
				//todo: irgendwie ohne direkte Refferenz!
				Application.application.furtherStage.addEventListener(CallNewMediaEvent.CALL_NEW_MEDIA, validateMediaEvent);
			}
			
			private function validateMediaEvent(event:CallNewMediaEvent):void
			{
				addMediaType(...);
			}
			
			private function addMediaType(...):void
			{
				var mt:MediaType = new MediaType();
				this.addChild(mt);
			}
		]]>
	</mx:Script>
</mx:HBox>
MediaType:
Code:
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml">
	<mx:Script>
		<![CDATA[
			import mx.events.ModuleEvent;
			import mx.modules.ModuleLoader;

			private var moduleLoader:ModuleLoader;
			
			public function init():void
			{
				moduleLoader = new ModuleLoader();
				
				moduleLoader.addEventListener(ModuleEvent.READY, moduleReady);
				
				moduleLoader.url = "modules/Audio.swf";
				moduleLoader.loadModule();
				addChild(moduleLoader);
			}
			
			private function moduleReady(event:ModuleEvent):void
			{
				// Initialwerte an das Module geben
				// am liebesten natürlich über ein Event
			}
		]]>
	</mx:Script>
</mx:Canvas>
FurtherStage:
Code:
<?xml version="1.0" encoding="utf-8"?>
<mx:Accordion xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:views="views.*">
	
		<mx:TabNavigator label="asd">
			
			<!--kommen später aus ner XML-->
			<views:MediaList label="1" />
			<views:MediaList label="2" />
			<views:MediaList label="3" />
			<views:MediaList label="4" />
	
		</mx:TabNavigator>
	
		<views:MediaList label="asd2" />
	
</mx:Accordion>
MediaList:
Code:
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:views="views.*" creationComplete="init()">

	<mx:Metadata>
		[Event(name="userCallNewMedia", type="events.CallNewMediaEvent")]
	</mx:Metadata>

	<mx:Script>
		<![CDATA[
			import mx.events.ListEvent;
			import mx.rpc.events.ResultEvent;
			import events.CallNewMediaEvent;
			
			[Bindable] public var listData:ArrayCollection;
			
			public function init():void
			{
				dataService.send();
			}
			
			public function dataService_Result(event:ResultEvent):void
			{
				listData = event.result.furtherMediaData.furtherMedia as ArrayCollection;
			}
			
			private function listChanged(event:ListEvent):void
			{
				var myEvent:CallNewMediaEvent = new CallNewMediaEvent(CallNewMediaEvent.CALL_NEW_MEDIA);
				//event noch weiter spezifizieren
				dispatchEvent(myEvent);
			}

		]]>
	</mx:Script>

    <mx:HTTPService
		id="dataService"
		result="dataService_Result(event)"
		url="data/defaultMediaData.xml" />

    <mx:List id="liste" 
    	dataProvider="{listData}"
    	itemRenderer="views.ListMedia" 
    	change="listChanged(event)"/>
    
</mx:Canvas>
ListMedia:
Code:
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" 
	horizontalScrollPolicy="off" 
	verticalScrollPolicy="off" 
	includeInLayout="true" >

<!-- nur ein paar Labels etz. -->

</mx:Canvas>
phoo - ok das sind die Wichtigen. In der MediaStage hab ichs markiert
Zitat:
//todo: irgendwie ohne direkte Refferenz!
ullim ist offline   Mit Zitat antworten
Alt 20-11-2008, 21:21   #8 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.856
In der VBox solltest du die Referenzierung vornehmen können. Ohne Refrenzen zu arbeiten ist ins Blaue raten und das hat nichts mit Software Entwicklung zu tun.
Omega Psi ist offline   Mit Zitat antworten
Alt 20-11-2008, 21:37   #9 (permalink)
Neuer User
 
Registriert seit: Mar 2003
Ort: Frankfurt
Beiträge: 32
Meinst du in der Application?
Code:
import events.CallNewMediaEvent;
vBox.addEventListener(CallNewMediaEvent.CALL_NEW_MEDIA, mediaStage.validateMediaEvent);
Da kann er aber die Funktion nicht finden. (ich habe sie auch public gesetzt)
ullim ist offline   Mit Zitat antworten
Alt 20-11-2008, 21:41   #10 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 11.856
Nein, das meine ich nicht. Du musst die Events der MediaList Komponente einen EventLister im Scope in der auch die VBox Instanz ist, triggern lassen.
Omega Psi ist offline   Mit Zitat antworten
Alt 20-11-2008, 22:16   #11 (permalink)
Neuer User
 
Registriert seit: Mar 2003
Ort: Frankfurt
Beiträge: 32
Hmm da blick ich jetzt nicht durch... Ich versuch das mal zu verstehen:
  1. Die Events der MediaList laufen ja durch bis runter zur Application.
  2. Dabei durchlaufen sie die HBox in der auch die mediaStage ist.
  3. Dann wäre also die HBox ein Scope in dem die mediaStage und die furtherStage ist.
  4. Also kann ich von der MediaStage aus mit parent zur vBox dann mit parent zur hBox und da den EventListener anmelden.

Code:
parent.parent.addEventListener(CallNewMediaEvent.CALL_NEW_MEDIA, validateMediaEvent);
Ha! Das funktioniert! Ich war mir nicht bewusst, dass die Boxen (ich nehme an alle Container) einen eigenen Scope haben.

Vielen vielen Dank Omega Psi!

Ist das jetzt so richtig oder musst du mir nochmal auf die Finger hauen?
ullim ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
event, event bubbling, eventlistener

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 01:16 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele