Flashhilfe.de - Flash Community

valueobject im popup ansprechen? [Flex 4]

 


AntwortenRegistrieren Seite1  

flex5500#1
Benutzerbild von flex5500
Beiträge: 14
Wohnort: Koblenz
Registriert: Jul 2011

13.07.2011, 16:12

Hi Flash Community,

ich stehe vor dem Problem, dass ich im popup kein ValueObject ansprechen kann. Das liegt wahrscheinlich daran dass mein valueobject nur im Hauptdokument(dataUsers.mxml) verfügbar ist.

Ich weiß generell nicht wie ich Objekte, Variablen, etc. von anderen MXML-Dokumenten ansprechen, kann obwohl ich den Namespace eingebunden habe.

Die Ordnerstruktur kann man meinem angehängtem Bild entnehmen.



in dataUsers.mxml ist das valueobject und der Service wie folgt definiert:

ActionScript:
1
2
3
4
5
6
7
<s:CallResponder id="getAllItemsResult"/>
      <usersservice:UsersService id="usersService" fault="Alert.show(event.fault.faultString + 'n' + event.fault.faultDetail)"
                         showBusyCursor="true"/>
      <valueObjects:VOUsers id="vOUsers" />

   </fx:Declarations>
   <fx:Binding source="dataGridUsers.selectedItem as VOUsers" destination="vOUsers"/>


meine popup Funktion sieht wie folgt aus:

ActionScript:
1
2
3
4
5
6
7
8
public function showPopUp():void {
              var helpWindow:TitleWindow = TitleWindow(PopUpManager.createPopUp(this, over, false));
              helpWindow.title = "Über";
              helpWindow.x = 150;
              helpWindow.y = 150;
              helpWindow.closeButton;            
              helpWindow.addEventListener( CloseEvent.CLOSE, onClose );
           }


Sobald man dann auf den Button im Datagrid klickt geht das popup auf.

Die popup Datei(over.xml) ist wie folgt geschrieben:

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
<?xml version="1.0" encoding="utf-8"?>
<s:TitleWindow xmlns:fx="http://ns.adobe.com/mxml/2009"
            xmlns:s="library://ns.adobe.com/flex/spark"
            xmlns:mx="library://ns.adobe.com/flex/mx"
            xmlns:valueObjects="valueObjects.*"
            xmlns:usersservice="services.usersservice.*"
            xmlns:datagrids="datagrids.*"
            width="450" height="580">
   
   <fx:Script>
      <![CDATA[
         import mx.controls.Alert;
         import mx.events.FlexEvent;
         
         protected function button2_clickHandler(event:MouseEvent):void
         {
              //trace(vOUsers.Group);            
         }
         
      ]]>
   </fx:Script>
   
   <fx:Binding source="FormPower as VOUsers" destination="vOUsers"/>
   
   <fx:Declarations>
      <valueObjects:VOUsers id="vOUsers" />
      <usersservice:UsersService id="usersService"
                           fault="Alert.show(event.fault.faultString + 'n' + event.fault.faultDetail)"
                           showBusyCursor="true"/>
   </fx:Declarations>
   
   <!--<s:Button click="button2_clickHandler(event)" />-->
   <s:Form id="FormPower" x="60" y="73">
      <s:FormItem label="User ID">
         <s:Label id="lala" text="{vOUsers.id}" />
      </s:FormItem>
   
   </s:Form>
</s:TitleWindow>


Normalerweise müsste ich diese Datei ohne den declaration- und binding-Tag lösen...nur weiß ich leider nicht wie ich mein ValueObject aus dataUsers.mxml ansprechen kann.


Mein ValueObject heißt hier vOUsers darin gibt es Eigenschaften wie vOUsers.ID, vOUsers.Group, etc. . Leider ist der Wert vOUsers.Group und alle anderen im Popup leer. Mein Projekt orientiert sich ein wenig an Adobe's Flex Test Drive (Eine Andwenung in einer Stunde erstellen)

Würde mich über jede Hilfe freuen!

Viele Grüße
flex5500

Angehängte Dateien:
Bild Unbenannt.PNG9.54 KB
Bild Unbenannt.PNG9.54 KB
Bild Unbenannt.PNG9.54 KB
Schlagwörter: adobe, binding, Flex, object, popup, value
Geändert von flex5500 am 13.07.11 um 17:04 Uhr
Werbung
Beiträge: 0
Registriert: Feb 2016


Sebastian#2
Benutzerbild von SebastianFlashhilfe.de Moderator
Beiträge: 6981
Wohnort: München
Registriert: Jan 2002

14.07.2011, 00:17

Hallo,

versuch es mal mit einem Typcast auf Deine Klasse.
ActionScript:
1
2
3
4
5
6
7
8
public function showPopUp():void {
                var helpWindow:over = over(PopUpManager.createPopUp(this, over, false));
                helpWindow.title = "Über";
                helpWindow.x = 150;
                helpWindow.y = 150;
                helpWindow.closeButton;            
                helpWindow.addEventListener( CloseEvent.CLOSE, onClose );
             }

Dann kannst Du ganz einfach eine Methode oder Variable definieren und die entsprechenden Daten übergeben.

Falls ich Dich falsch verstanden habe, kannst Du mal ein minimal Beispiel-Projekt einem Beitrag anhängen?

Viele Grüße,
Sebastian
JavaScript & JavaFX Freelancer || Flashhilfe @ Twitter || XING Profil
flex5500#3
Benutzerbild von flex5500
Beiträge: 14
Wohnort: Koblenz
Registriert: Jul 2011

Themenautor/in

14.07.2011, 10:21

Guten Morgen Sebastian,

danke für deine Antwort. Nur wie mache ich so einen Typcast? Flex ist mir leider (noch) etwas neu. Könntest du dazu vielleicht ein kleines Beispiel machen? Ich bezweifle allerdings, dass dies so geht, da das ValueObject keine einfache Variable oder Methode ist. Sondern eher ein Objekt.

Allerdings ist meine Problematik auch ziemlich schwer zu beschreiben und habe dir daher mal Minimalprojekt zusammengebastelt, dies lässt sich nur mit einem Webserver starten, da hier noch php ins Spiel kommt.

Sollte was am Projekt fehlen, dann sag mir einfach bescheid.

Viele Grüße und nochmals danke im Voraus
Christian

Angehängte Dateien:
Komprimierte Datei Example.zip19.35 KB
Sebastian#4
Benutzerbild von SebastianFlashhilfe.de Moderator
Beiträge: 6981
Wohnort: München
Registriert: Jan 2002

14.07.2011, 10:51

Hallo Christian,

ich hatte in dem Code-Beispiel bereits ein Typecast Beispiel gezeigt. helpWindow ist also num vom Typ over. - kurz am Rande, Klassen sollten immer mit einem großen Buchstaben anfangen!
Was Du nun nur noch machen musst ist der Over Klasse Deine Daten zu übergeben.

Beispiel:
ActionScript:
1
2
3
4
5
6
7
8
9
         public function showPopUp():void {
              var helpWindow:over = over(PopUpManager.createPopUp(this, over, false));
              helpWindow.title = "Über";
              helpWindow.x = 150;
              helpWindow.y = 150;
              helpWindow.vOUsers = vOUsers;
              helpWindow.closeButton;            
              helpWindow.addEventListener( CloseEvent.CLOSE, onClose );
           }


Falls die Daten nicht gebindet sind funktioniert diese Variante nicht. In dem Fall würde ich es mit einem Result Handler umsetzen:
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                  xmlns:s="library://ns.adobe.com/flex/spark"
                  xmlns:mx="library://ns.adobe.com/flex/mx"
                  xmlns:usersservice="services.usersservice.*"
                  width="1115" height="639" xmlns:valueObjects="valueObjects.*">
   <fx:Script>
      <![CDATA[
         import mx.controls.Alert;
         import mx.events.CloseEvent;
         import mx.events.FlexEvent;
         import mx.managers.PopUpManager;
         
         import spark.components.TitleWindow;
         
         private var helpWindow:over;
         
         protected function dataGrid_creationCompleteHandler(event:FlexEvent):void
         {
              getAllItemsResult.token = usersService.getAllItems("test","test","test","test","test","test");
           }
         
         public function showPopUp():void {
              helpWindow = over(PopUpManager.createPopUp(this, over, false));
              helpWindow.title = "Über";
              helpWindow.x = 150;
              helpWindow.y = 150;
              helpWindow.closeButton;            
              helpWindow.addEventListener( CloseEvent.CLOSE, onClose );
           }
         
         public function onClose( event:CloseEvent ):void {
              PopUpManager.removePopUp( TitleWindow(event.currentTarget) );
           }
         
      ]]>
   </fx:Script>
   <fx:Declarations>
      
      <fx:Component id="edit">
         <mx:HBox>
            <fx:Script>
               <![CDATA[
                  import mx.rpc.events.ResultEvent;
                  protected function datagridButton_clickHandler(event:MouseEvent):void
                  {                     
                       outerDocument.showPopUp();                     
                    }
                  
                  private function result(event:ResultEvent):void
                  {
                       helpWindow.vOUsers = vOUsers;
                    }
               ]]>
            </fx:Script>
            <mx:Button label="edit" click="datagridButton_clickHandler(event)" />
         </mx:HBox>
      </fx:Component>
      
      <valueObjects:VOUsers id="vOUsers" />
      <s:CallResponder id="getAllItemsResult"/>
      <usersservice:UsersService id="usersService"
                           fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)"
                           result="result(event);"
                           showBusyCursor="true"/>
      <!-- Place non-visual elements (e.g., services, value objects) here -->
   </fx:Declarations>
   
   <mx:DataGrid id="dataGrid" x="84" y="185"
             creationComplete="dataGrid_creationCompleteHandler(event)"
             dataProvider="{getAllItemsResult.lastResult}">
      <mx:columns>
         <mx:DataGridColumn dataField="id" headerText="id" itemRenderer="{edit}"/>
         <mx:DataGridColumn dataField="tags" headerText="tags"/>
         <mx:DataGridColumn dataField="first_name" headerText="first_name"/>
         <mx:DataGridColumn dataField="logged_in" headerText="logged_in"/>
         <mx:DataGridColumn dataField="username" headerText="username"/>
         <mx:DataGridColumn dataField="name" headerText="name"/>
         <mx:DataGridColumn dataField="active" headerText="active"/>
         <mx:DataGridColumn dataField="Group" headerText="Group"/>
         <mx:DataGridColumn dataField="last_login" headerText="last_login"/>
      </mx:columns>
   </mx:DataGrid>
   
</s:WindowedApplication>


Den UserService Aufruf in Over kannst Du dann einfach entfernen.

Falls Du die Lösung nicht gefällt weil Du in Over die Daten selbst laden möchtest, einfach den Result-Handler dort integrieren.

Grüße,
Sebastian
JavaScript & JavaFX Freelancer || Flashhilfe @ Twitter || XING Profil
Werbung
Beiträge: 0
Registriert: Feb 2016


flex5500#5
Benutzerbild von flex5500
Beiträge: 14
Wohnort: Koblenz
Registriert: Jul 2011

Themenautor/in

14.07.2011, 11:39

Hi Sebastian,

der Ansatz ist eigentlich ganz prima.

Nur wirft mir der Compiler bei

ActionScript:
1
2
3
4
private function result(event:ResultEvent):void
                  {
                       outerDocument.helpWindow.vOUsers = vOUsers;                     
                    }


hier diesen Fehler aus:
- 1120: Access of undefined property vOUsers.

Das liegt daran dass der Funktionsaufruf sich im <fx:Component> - Tag befindet. Hier ist nach außen alles geschlossen. Funktionen lassen sich hier wie in meinem Fall (outerDocument.showPopUp();) nur verschachtelt über "outerDocument" selbst mit public bleibt die Funktion im <fx:Component>-Tag drin.

Ich habe dann versucht die Result Funktion direkt nach der Deklaration von showPopUP() zu platzieren und dort das casting ausgeführt. Allerdings läuft es irgendwie aufs Gleiche hinaus...

Error #1009: Cannot access a property or method of a null object reference.

Wo könnte hier der Fehler sein?

Wie würde die Variante aussehen wenn wir es im Over einbauen würde? Actionscript konnt ich bis jetzt ohne Probleme einbinden (von Datei zu Datei), aber mit dem ValueObject bin ich total überfordert...

Viele Grüße
Christian
Sebastian#6
Benutzerbild von SebastianFlashhilfe.de Moderator
Beiträge: 6981
Wohnort: München
Registriert: Jan 2002

14.07.2011, 11:56

Oh das mit dem Component kannte ich noch gar nicht. Da gibt es Flex 4 schon so lange und richtig benutzt habe ich es immer noch nicht.

Du kommst ja mittlerweile mit outerDocument.helpWindow auf den helpWindow. Das er nun sagt das Deine VO Variable nicht gefunden hat, hat also was mit dem Over.mxml zutun. Im Over muss der Tag
ActionScript:
1<valueObjects:VOUsers id="vOUsers" />

vorhanden sein. Oder Du definierst dort eine Public Variable oder Methode.

Grüße,
Sebastian
JavaScript & JavaFX Freelancer || Flashhilfe @ Twitter || XING Profil
Geändert von Sebastian am 14.07.11 um 11:56 Uhr
flex5500#7
Benutzerbild von flex5500
Beiträge: 14
Wohnort: Koblenz
Registriert: Jul 2011

Themenautor/in

14.07.2011, 12:04

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
public var helpWindow:over;
         
                  
         protected function dataGrid_creationCompleteHandler(event:FlexEvent):void
         {
              getAllItemsResult.token = usersService.getAllItems("0","0","0","0","0","0");
           }
         
         public function showPopUp():void {
              var helpWindow:TitleWindow = TitleWindow(PopUpManager.createPopUp(this, over, false));
              helpWindow.title = "Über";
              helpWindow.x = 150;
              helpWindow.y = 150;
              helpWindow
              helpWindow.closeButton;            
              helpWindow.addEventListener( CloseEvent.CLOSE, onClose );
           }
         
         public function onClose( event:CloseEvent ):void {
              PopUpManager.removePopUp( TitleWindow(event.currentTarget) );
           }
         
         public function result(event:ResultEvent):void
         {
              helpWindow.vOUsers = vOUsers;                     
           }


so sieht bei mir der <fx:script>-Tag aus...
in der Over.xml steht alles drin was ich ganz oben eingetragen habe.

edit: kann man auf das helpWindow ein vOUsers casten wenn es selber diese Eigenschaft noch gar nicht besitzt?
Geändert von flex5500 am 14.07.11 um 12:17 Uhr
Sebastian#8
Benutzerbild von SebastianFlashhilfe.de Moderator
Beiträge: 6981
Wohnort: München
Registriert: Jan 2002

14.07.2011, 12:26

Hier mal ein Beispiel. Du musst dann nur noch Deine Webservices einbauen und die Variable umbauen.

Example.mxml
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
72
73
74
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                  xmlns:s="library://ns.adobe.com/flex/spark"
                  xmlns:mx="library://ns.adobe.com/flex/mx"
                  xmlns:usersservice="services.usersservice.*"
                  width="1115" height="639" xmlns:valueObjects="valueObjects.*">
   <fx:Script>
      <![CDATA[
         import mx.collections.ArrayCollection;
         import mx.controls.Alert;
         import mx.events.CloseEvent;
         import mx.events.FlexEvent;
         import mx.managers.PopUpManager;
         
         import spark.components.TitleWindow;
         
         import valueObjects.TestVO;
         
         public var helpWindow:over;
         public var testVO:TestVO = new TestVO("Sebastian");
         
         
         private var test:ArrayCollection = new ArrayCollection([{id:1, tags:'bla',first_name:'ich'}]);
         
         public function showPopUp():void {
              helpWindow = over(PopUpManager.createPopUp(this, over, true));
              helpWindow.title = "Über";
              helpWindow.testVO = testVO;
              helpWindow.x = 150;
              helpWindow.y = 150;
              helpWindow.closeButton;            
              helpWindow.addEventListener( CloseEvent.CLOSE, onClose );
           }
         
         public function onClose( event:CloseEvent ):void {
              PopUpManager.removePopUp( TitleWindow(event.currentTarget) );
           }
         
      ]]>
   </fx:Script>
   <fx:Declarations>
      
      <fx:Component id="edit">
         <mx:HBox>
            <fx:Script>
               <![CDATA[
                  protected function datagridButton_clickHandler(event:MouseEvent):void
                  {
                       outerDocument.showPopUp();               
                    }
               ]]>
            </fx:Script>
            <mx:Button label="edit" click="datagridButton_clickHandler(event)" />
         </mx:HBox>
      </fx:Component>
      
   </fx:Declarations>   

<mx:DataGrid id="dataGrid" x="84" y="185"
          dataProvider="{test}">
   <mx:columns>
      <mx:DataGridColumn dataField="id" headerText="id" itemRenderer="{edit}"/>
      <mx:DataGridColumn dataField="tags" headerText="tags"/>
      <mx:DataGridColumn dataField="first_name" headerText="first_name"/>
      <mx:DataGridColumn dataField="logged_in" headerText="logged_in"/>
      <mx:DataGridColumn dataField="username" headerText="username"/>
      <mx:DataGridColumn dataField="name" headerText="name"/>
      <mx:DataGridColumn dataField="active" headerText="active"/>
      <mx:DataGridColumn dataField="Group" headerText="Group"/>
      <mx:DataGridColumn dataField="last_login" headerText="last_login"/>
   </mx:columns>
</mx:DataGrid>

</s:WindowedApplication>


Over.mxml
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
<?xml version="1.0" encoding="utf-8"?>
<s:TitleWindow xmlns:fx="http://ns.adobe.com/mxml/2009"
            xmlns:s="library://ns.adobe.com/flex/spark"
            xmlns:mx="library://ns.adobe.com/flex/mx"
            xmlns:valueObjects="valueObjects.*"
            xmlns:usersservice="services.usersservice.*"
            xmlns:datagrids="datagrids.*"
            width="450" height="580">
   
   <fx:Script>
      <![CDATA[
         import mx.controls.Alert;
         import mx.events.FlexEvent;
         
         import valueObjects.TestVO;
         
         public var testVO:TestVO;
         
         protected function button2_clickHandler(event:MouseEvent):void
         {
              trace(testVO.name);            
           }
         
      ]]>
   </fx:Script>
   
   <s:Button click="button2_clickHandler(event)" />
</s:TitleWindow>


Mein VO "TestVO"
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
package valueObjects
{
     public class TestVO
     {
        public var name:String;
        
        public function TestVO(name:String)
        {
           this.name = name;
        }
     }
}


Viele Grüße,
Sebastian
JavaScript & JavaFX Freelancer || Flashhilfe @ Twitter || XING Profil
flex5500#9
Benutzerbild von flex5500
Beiträge: 14
Wohnort: Koblenz
Registriert: Jul 2011

Themenautor/in

14.07.2011, 12:47

Das mit valueobjects wird bei leider etwas automatisiert gehandhabt.

Ich habe den webservice per Data => connect to runtime (php) eingebunden. Später habe ich die Rückgabewerte für eine Funktion eingestellt..in dem Falle die (getAllItems).

Das sind php dummy klassen die so ihren Zweck bis jetzt eigentlich gut erfüllt haben. Allerdings teilt sich mein Projekt in immer mehrere Dateien und so erschwert es mir den Zugriff auf das ValueObject.

Die Werte des ValueObject kommen aus einer Datenbank.

Daraus hat Flex dann die VOUsers generiert. Ich hab dir mal die generierten Daten und den webservice mitangehängt.


edit: kann es denn nicht sein dass es am Binding liegt?

Das Binding im Dokument vom Datagrid klappt und sieht so aus:

ActionScript:
1<fx:Binding source="dataGridUsers.selectedItem as VOUsers" destination="vOUsers"/>


Was ich da probiert habe mit

ActionScript:
1<fx:Binding source="FormPower as VOUsers" destination="vOUsers"/>


müsste falsch sein...nur weiß ich nicht wie ich auf ein popup binden kann.

Angehängte Dateien:
Komprimierte Datei webservice.zip3.00 KB
Geändert von flex5500 am 14.07.11 um 12:54 Uhr
flex5500#10
Benutzerbild von flex5500
Beiträge: 14
Wohnort: Koblenz
Registriert: Jul 2011

Themenautor/in

18.07.2011, 11:17

dank willie33's Lösung lassen sich die ValueObjects auch im Popup ansprechen. Und daher is hier die Frage beantwortet.

hier der Link zum Fred:

http://www.flashhilfe.de/forum/flex/variablen-aus-dem-hauptdokument-in-einem-nativewindowpopup-ansprechen-293762-293762.html

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