Flashhilfe.de - Flash Community

Mate Frameworkt - Injectors [Flash 10]

 


AntwortenRegistrieren Seite1 2  

longCrew#1
Benutzerbild von longCrew
Beiträge: 380
Wohnort: München, Berlin
Registriert: Apr 2009

16.11.2009, 11:46

hi leute,

hab ein prob. mit dem Mate-Framework:

ich weiss nicht wie ich daten wieder zurückgeben kann ich mache alles so wie es in der mate-doku steht aber es funkt nicht

ich habe einen Manager VisuManager der daten geliefert bekommt (das funktioniert;) weil ein Event ausgelöst wird.
jetz möchte ich die daten die ich in der VisuManager erhält an die View weitergeben.
Dies funktioniert über die EventMap mit Injectors
Jedoch kommt bei mir nie die Daten an in meiner View.
was mache ich falsch?


MainEventMap:
ActionScript:
1
2
3
<Injectors target="{VisuView}">
      <PropertyInjector targetKey="currentF" source="{VisuManager}" sourceKey="currentF"/>
   </Injectors>


VisuManager:
sind die daten(die Variable f) die ich an die View zurückgeben möchte
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
   public var smChannel:SoundChannel = new SoundChannel();
      private var Spectrum : ByteArray;
      private var f:String;   
      
      // public var currentF:Number;   
   

      public function getSpectrum(myChannel:SoundChannel):void
      {
         smChannel = myChannel;   
         trace("........................");
            Spectrum = new ByteArray();
            SoundMixer.computeSpectrum(Spectrum, false,0 );
         
         
             var f:String;
            
             f = Spectrum.readFloat().toString();
             trace(f);
         
      //    smChannel.addEventListener(Event.COMPLETE, loaded);
      
      }
      public function loaded(event:Event):void{
            _currentF = Spectrum.readFloat();
         
      }
      
      
      
       /****** Setters and Getters ******/
      [Bindable] private var _currentF : Number = 0;
       
        [Bindable (event="numberChanged")]
        public function get currentF () : Number
        {
            return _currentF;
        }
       
        /****** Mthods ******/
        public function setCurrentF (currentF : Number) : void
        {
            _currentF = currentF;
            dispatchEvent(new Event('numberChanged'));
        }


und schließlich in der View habe ich folgenden Code:
ActionScript:
1
2
3
4
5
6
7
public function drawSpectrum(currentF:Number):void
      {
         trace("........................");
   //      smChannel = myChannel;   
         _currentF = currentF;
         trace(_currentF +"......");
         


was mache ich flash?? ich hoffe mir kann jemand weiterhelfen


mfg seb
Die Lösung ist: das Suchen.
LongCrew = 2 people
Werbung
Beiträge: 0
Registriert: Feb 2016


badskill#2
Benutzerbild von badskillFlashhilfe.de Moderator
Beiträge: 5285
Wohnort: Bernau (bei Berlin)
Registriert: Nov 2002

16.11.2009, 13:53

Hi,
drawSpectrum? Wann wird die Funktion aufgerufen?
Du musst currentF in der View ebenfalls als Getter/Setter implementieren.
Hier mal ein reduziertes Beispiel:
Application:
ActionScript:
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
   xmlns:mx="http://www.adobe.com/2006/mxml"
   xmlns:injectortest="injectortest.*">
   
   <injectortest:InjectorMap />
   <injectortest:InjectorView />
   
</mx:Application>

InjectorModel:
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
package injectortest
{
   import flash.events.TimerEvent;
   import flash.utils.Timer;
   
   public class InjectorModel
   {
      [Bindable]
      public var injectorValue : uint = 0;
      
      private var _timer : Timer;
      
      public function InjectorModel()
      {
         _timer = new Timer( 2000 );
         _timer.addEventListener( TimerEvent.TIMER, onTimer );
         _timer.start();
      }
      
      private function onTimer( e:TimerEvent ) : void
      {
         injectorValue++;
      }
   }
}

InjectorView:
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
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300">
   
   <mx:Script>
      <![CDATA[
         
         private var _injectorValue : uint;
         
         [Bindable("injectorValueChanged")]
         public function get injectorValue() : uint
         {
            return _injectorValue;
         }
         
         public function set injectorValue( value:uint ) : void
         {
            if ( _injectorValue != value )
            {
               _injectorValue = value;
               injectorLabel.text = value.toString();
               dispatchEvent( new Event( "injectorValueChanged" ) );
            }
         }
         
      ]]>
   </mx:Script>
   
   <mx:Label id="injectorLabel" />
   
</mx:Canvas>

Und noch die EventMap:
ActionScript:
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="utf-8"?>
<EventMap xmlns:mx="http://www.adobe.com/2006/mxml"
   xmlns="http://mate.asfusion.com/">
   
   <Injectors target="{InjectorView}">
      <ObjectBuilder generator="{InjectorModel}" />
      <PropertyInjector targetKey="injectorValue" source="{lastReturn}" sourceKey="injectorValue" />
   </Injectors>
   
</EventMap>

Ergebniss: Zahl zählt wie erwartet in der View hoch.
longCrew#3
Benutzerbild von longCrew
Beiträge: 380
Wohnort: München, Berlin
Registriert: Apr 2009

Themenautor/in

16.11.2009, 14:48

hey badskill,

vielen dank 1stens für das beispiel und 2tens für deinen schnelle hilfe.

funktioniert jetzt;)

hätte noch ne frage warum muss ich auf in der View getter und setter von currentF implementieren?

mfg
sebi
Die Lösung ist: das Suchen.
LongCrew = 2 people
badskill#4
Benutzerbild von badskillFlashhilfe.de Moderator
Beiträge: 5285
Wohnort: Bernau (bei Berlin)
Registriert: Nov 2002

16.11.2009, 14:56

Weil du sonst ja garnicht darauf reagieren kannst, wenn sich currentF ändert.
Werbung
Beiträge: 0
Registriert: Feb 2016


longCrew#5
Benutzerbild von longCrew
Beiträge: 380
Wohnort: München, Berlin
Registriert: Apr 2009

Themenautor/in

16.11.2009, 15:05

achso stimmt.

ich hätte jetz nochmal ne frage, klingt evtl a bissl blöd...

ich übergebe von meinen VisuManager daten an die VisuView.
die Daten sind einfach zahlen.

Mit den Zahlen sollte in der VisuView etwas gezeichnet werden z.B. ein rechteck.

Könnte ich es auch anderes machen und zwar so:
ich zeichne in meinen Manager das rechteck und gebe es an die View zurück??
Das wäre eigtl nicht logisch oder?
die view sollte schon das malen des Rechteckes übernhemen oder?
Die Lösung ist: das Suchen.
LongCrew = 2 people
Geändert von longCrew am 16.11.09 um 15:06 Uhr
badskill#6
Benutzerbild von badskillFlashhilfe.de Moderator
Beiträge: 5285
Wohnort: Bernau (bei Berlin)
Registriert: Nov 2002

16.11.2009, 15:15

Ich würde die View entscheiden lassen, was sie mit den Daten anstellt.
longCrew#7
Benutzerbild von longCrew
Beiträge: 380
Wohnort: München, Berlin
Registriert: Apr 2009

Themenautor/in

16.11.2009, 15:17

ok danke für deine antwort;)
Die Lösung ist: das Suchen.
LongCrew = 2 people
longCrew#8
Benutzerbild von longCrew
Beiträge: 380
Wohnort: München, Berlin
Registriert: Apr 2009

Themenautor/in

16.11.2009, 22:14

hey badskill
hab ein kl prob und kann den fehler net finden:

meine PlayListView:

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
   

   <mx:Script>
      <![CDATA[
         import mx.collections.ArrayCollection;
         import com.DipA.events.PlayListEvent;
         

         
           private var _AC_Sound:ArrayCollection;
          
           [Bindable("injectorValueChanged")]
           public function get AC_Sound() : ArrayCollection
           {
               return _AC_Sound;
           }
          
           public function set AC_Sound( value:ArrayCollection ) : void
           {
               if ( _AC_Sound != value )
               {
                 _AC_Sound = value;
                    songList.dataProvider = value.toString();
                 dispatchEvent( new Event( "injectorValueChanged" ) );
               }
           }
            
            
         
         
         
      ]]>
   </mx:Script>
   
   
   
   


<mx:DataGrid id="songList" >
      <mx:columns>
            <mx:DataGridColumn width="168" headerText="Title" dataField="title"  />
            <mx:DataGridColumn width="160" headerText="Album" dataField="album"/>
            <mx:DataGridColumn width="160" headerText="Album" dataField="duration"/>
            
         </mx:columns>
      </mx:DataGrid>

      </mx:VBox>



meine
MainEventMap

ActionScript:
1
2
3
4
5
   
   <Injectors target="{PlayListView}">
      <ObjectBuilder generator="{PlayListManager}" />
      <PropertyInjector targetKey="AC_Sound" source="{lastReturn}" sourceKey="AC_Sound" />
  </Injectors>



was ist falsch??
Die Lösung ist: das Suchen.
LongCrew = 2 people
badskill#9
Benutzerbild von badskillFlashhilfe.de Moderator
Beiträge: 5285
Wohnort: Bernau (bei Berlin)
Registriert: Nov 2002

17.11.2009, 00:25

ActionScript:
1songList.dataProvider = value.toString();

Ein DataGrid erwartet sicherlich keinen String als dataProvider.
longCrew#10
Benutzerbild von longCrew
Beiträge: 380
Wohnort: München, Berlin
Registriert: Apr 2009

Themenautor/in

17.11.2009, 08:33

juhu funktioniert;)  hatte vergessen den Array auf public und nicht private zu setzen!!!

hab noch ne verständisfrage
ActionScript:
1
2
3
4
Injectors target="{InjectorView}">
      <ObjectBuilder generator="{InjectorModel}" />
      <PropertyInjector targetKey="injectorValue" source="{lastReturn}" sourceKey="injectorValue" />
  </Injectors>


du hast hier source="{lastReturn}" gemacht bei mir is das jetz auch so denn wenn ich ne Fkt angebe die in meinen PlaylistManger ist
kommt die Meldung das diese (obwohl public) nicht gefunden werden kann.
mein frage also was bedeutet dieses lastReturn wenn ich niergends diese fkt def hab???

ich dacht immer als source muss man die methode angeben wo die Var erzeugt wird ...

mfg seb
Die Lösung ist: das Suchen.
LongCrew = 2 people
badskill#11
Benutzerbild von badskillFlashhilfe.de Moderator
Beiträge: 5285
Wohnort: Bernau (bei Berlin)
Registriert: Nov 2002

17.11.2009, 10:47

Info zu lastReturn.
Ich habe lastReturn hier nur genutzt, um den Beispielcode kurz zu halten. Im allgemeinen erstelle ich notwendige Manager in einem EventHandler, der auf FlexEvent.INITIALIZE hört.

Wenn du auf Methoden und nicht auf Eigenschaften zugreifen möchtest, benutze den MethodInvoker.
longCrew#12
Benutzerbild von longCrew
Beiträge: 380
Wohnort: München, Berlin
Registriert: Apr 2009

Themenautor/in

17.11.2009, 11:03

ah danke für die Info

hab folgende fehlermeldung und weiss nicht woran das liegt
1 ARGUMENT SUPPLIED: event.argumentsIEvent
- STACK TRACE: TypeError: Error #1034: Typumwandlung fehlgeschlagen: "event.argumentsIEvent" kann nicht in Array umgewandelt werden.

der witz ist argumentsIEvent immer schon als Array definiert

MainEventMap:
ActionScript:
1
2
3
4
5
    <!-- PlayListEvent.DISINVOKE _____________________________________________________ -->
    <EventHandlers type="{PlayListEvent.DISINVOKE}" debug="true">
       <MethodInvoker generator="{ PlayListManager }"
          method="disInvokeEvent" arguments="event.argumentsIEvent" />
    </EventHandlers>


PlaylistView:
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//InvokeEvent über init()-ausgelöst
public function onInvokeEvent(Ievent:InvokeEvent):void
         {
         //   var argumentsIE:Array = new Array();
            //argumentsIE = event.arguments;
            
            //getArguments stecken jetz Arg von event:invokeEvent drin -> jetz an PLMan. übergeb
            var getArguments:Array = new Array();
            getArguments = Ievent.arguments as Array;
            trace(getArguments + "------------------------------------getArguments");
            
            trace("onINVOKEevent---------------------------------------------onInvokeEvent");
            var event:PlayListEvent = new PlayListEvent(PlayListEvent.DISINVOKE);
            event.argumentsIEvent = getArguments;
            dispatchEvent(event);
         }



PlayListEvent
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
   public class PlayListEvent extends Event
   {
      //.........................................Constants....................................
      public static const OPENFILESYSTEM:String = "openFileSystemEvent";
      public static const DISINVOKE:String = "dispatch InvokeEvent";
         
   
      
      
      //.........................................Properties...................................
   
      public var argumentsIEvent:Array;
      
      


und in der PlaylistManager
ActionScript:
1
2
public function disInvokeEvent(argumentsIEvent:Array):void
         {...}


definiere ich argumentsIEvent als Object funktioert es ich verstehe nicht warum er mir das Array nicht animmt

mfg seb
Die Lösung ist: das Suchen.
LongCrew = 2 people
badskill#13
Benutzerbild von badskillFlashhilfe.de Moderator
Beiträge: 5285
Wohnort: Bernau (bei Berlin)
Registriert: Nov 2002

17.11.2009, 11:10

ActionScript:
1arguments="{event.argumentsIEvent}"

Geschweifte Klammern nicht vergessen.
longCrew#14
Benutzerbild von longCrew
Beiträge: 380
Wohnort: München, Berlin
Registriert: Apr 2009

Themenautor/in

17.11.2009, 11:15

mensch danke diese blöden kleinen fehler;)
Die Lösung ist: das Suchen.
LongCrew = 2 people
longCrew#15
Benutzerbild von longCrew
Beiträge: 380
Wohnort: München, Berlin
Registriert: Apr 2009

Themenautor/in

17.11.2009, 15:45

hi badskill
es funktioniert alles soweit in der View wird das lied angezeigt jedoch wenn ich 2 lieder gleichzeitig lade wird nur das zuletzt geldadene angezeigt
meine ArrayCollection also überschrieben

was muss ich tun damit das lied hinzugefügt wird ich habe schon einiges versucht (addItem usw) aber
irgendwie funkt des net.


ps ich steh auf kriegsfuß mit Arrays;)
Die Lösung ist: das Suchen.
LongCrew = 2 people
badskill#16
Benutzerbild von badskillFlashhilfe.de Moderator
Beiträge: 5285
Wohnort: Bernau (bei Berlin)
Registriert: Nov 2002

17.11.2009, 16:23

Wenn du schon weisst, dass du deine ArrayCollection überschreibst, warum machst du es dann? ;)
Wie versuchst du auf die ArrayCollection zuzugreifen? Liegt diese im Model/Manager?

AntwortenRegistrieren Seite1 2  

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-2019 Sebastian Wichmann - Flashhilfe.de