Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 11-01-2012, 09:34   #1 (permalink)
Neuer User
 
Registriert seit: Jan 2012
Beiträge: 29
Dictionary mit Typen funktioniert nicht immer

Hallo,

In meiner Flash-Anwendung habe ich mehrmals das Szenario dass ich verschiedene Arten von Objekten an der GUI anzeigen möchte. Diese Objekte haben die gleiche Basisklasse. Außerdem wird jedes Objekt mit einem eigenen DataRenderer angezeigt. Damit für jedes Objekt auch der richtige Renderer ausgewählt wird benutze ich ein Dictionary um die Typzuordnung richtig zu regeln. Das sieht dann so aus:

Code:

Code:
var dict:Dictionary = new Dictionary();
dict[ItemsLayer] = new ClassFactory(ItemsLayerRenderer);
dict[BackgroundLayer] = new ClassFactory(BackgroundLayerRenderer);
dict[ClippingInfoLayer] = new ClassFactory(ClippingInfoLayerRenderer);
dict[ProductLayer] = new ClassFactory(ProductLayerRenderer);
dict[BorderLayer] = new ClassFactory(BorderLayerRenderer);
Hier ist der Code um den entsprechenden Renderer zu ermitteln:
Code:

Code:
private function getFactory():ClassFactory
{
  if(data == null) return null;
  for(var type:* in _dictionary)
  {
    if(data is Class(type))
      return ClassFactory(_dictionary[type]);
  }
  return null;
}
Dieser Codeteil befindet sich in einer eigenen Komponente, welche für ein beliebiges Objekt (data) eine ClassFactory auswählt. Diese Komponente brauche ich an mehreren Stellen (also nicht nur für die Layer).

Das ganze funktioniert im Prinzip auch. Allerdings kommt es seit kurzem zu einem Problem.
Die oben aufgelisteten Klassen für das Dictionary leiten alle von einer Basisklasse Layer ab. Neu hinzugekommen ist die Klasse ClippingInfoLayer, welche als einzige nicht direkt von Layer, sondern von ProductLayer ableitet.
Damit die getFactory()-Methode dieser Klasse auch wirklich den ClippingInfoLayerRenderer, und nicht den ProductLayerRenderer zuweist habe ich den Eintrag für diese konkretere Klasse absichtlich zuerst ins Dictionary geschrieben. Ich gehe davon aus dass die for-Schleife die Elemente von vorne nach hinten durchläuft. Nun kommt es aber hin und wieder sporadisch einmal vor dass für Elemente dieses Typs trotzdem der Renderer für seine Basisklasse ermittelt wird. Drücke ich im Browser auf Aktualisieren behebt sich dieses Problem manchmal. Ich habe den Eindruck als würde für die Klasse ClippingInfoLayer zufällig entweder der ClippingInfoLayerRenderer oder der ProductLayerRenderer zurückgegeben werden.

Es wäre toll wenn mir jemand Tipps geben könnte wie ich dieses Problem umgehen könnte. Wenn jemand bessere Lösungsansätze für mein Problem hat wäre ich daran natürlich auch interessiert.
Lector ist offline   Mit Zitat antworten
Alt 11-01-2012, 09:47   #2 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Hallo und willkommen im Forum!
Arbeite doch mit der contructor-Eigenschaft statt mit is! Diese sollte ja immer auf die konkrete Klasse und nicht auf eine der Superklassen zeigen.

P.S.: Wo kommt eigentlich dieses data her?
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!
Martin Kraft ist offline   Mit Zitat antworten
Alt 11-01-2012, 10:29   #3 (permalink)
Neuer User
 
Registriert seit: Jan 2012
Beiträge: 29
Hallo,

Danke für die schnelle Antwort. Das Data-Objekt ist eine Instanz eines beliebigen Objekts. Für dieses Objekt soll dann, je nach Typ des Objekts, eine ClassFactory eines entsprechenden Anzeigeobjekts ermittelt werden. Diese Aufgabe übernimmt mein TypeBasedContentController, eine eigene Komponente die ich mir gebastelt habe.

Bsp:

Ich initiiere meinen TypeBasedContentController mit dem Dictionary aus meinem ersten Post. Anschließend schreibe ich in das Data-Element des Controllers ein Objekt vom Typ BackgroundLayer. Wenn nun die Funktion getFactory() aufgerufen wird sollte eine ClassFactory zurückkommen mit der ich Objekte vom Typ BackgroundLayerRenderer erzeugen kann (so wie im Dictionary angegeben). Das funktioniert wie gesagt auch. Nur wenn eine Klasse von der anderen ableitet wird ab und zu der Renderer der Basisklasse verwendet und nicht der konkretere.

Ich habe gerade mal die Typprüfung umgebaut:
Code:
private function getFactory():ClassFactory
{
	if(data == null) return null;
	
	for(var type:* in _dictionary)
	{
		if(data.constructor == Class(type).prototype.constructor)
			return ClassFactory(_dictionary[type]);
	}
			
	return null;
}
Es scheint jetzt alles zu funktionieren. Ich habe auch zur Sicherheit 10 mal auf Refresh gedrückt und ich habe den Eindruck als würde der sporadische Fehler nicht mehr auftreten.
Lector ist offline   Mit Zitat antworten
Alt 11-01-2012, 10:33   #4 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Sollte nicht das hier reichen?!
ActionScript:
  1. if(data.constructor === type)
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!
Martin Kraft ist offline   Mit Zitat antworten
Alt 11-01-2012, 10:38   #5 (permalink)
Neuer User
 
Registriert seit: Jan 2012
Beiträge: 29
Ja! Das scheint zu reichen
Lector ist offline   Mit Zitat antworten
Antwort

Lesezeichen

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


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Dictionary funktioniert nich :S screeny ActionScript 3 16 01-09-2009 14:56
Typen Typen Typen ... konvertieren? TeeJay ActionScript 2 2 07-03-2007 16:47
setIntervall funktioniert nicht immer..? meruhh ActionScript 1 1 08-04-2006 22:19
Rollover funktioniert nicht immer??!! asyoulikeit Flash MX 5 15-07-2004 17:20
geturl funktioniert nicht immer!?! Isa23 Flash MX 2 16-05-2004 16:37


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

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


Copyright ©1999 – 2012 Marc Thiele