Shaun Mccran

My digital playground

03
A
P
R
2009

AIR Phone Book application - Part 2 (Functions and WebService)

As our application starts I want to fire the request for data, so we call an init() method on initialization. Also I have turned the flex chrome off here with 'showFlexChrome="false"'.

The init() method calls an event listener that controls the window movement (Drag and drop) and makes a call to getData().

view plain print about
1import mx.controls.Alert;
2 import mx.collections.*;
3 import mx.rpc.events.FaultEvent;
4 import mx.rpc.events.ResultEvent;
5 import mx.collections.ArrayCollection;
6
7     [Bindable]
8     private var loadedData:ArrayCollection;
9 public function init():void
10 {
11        // start the move listener
12        moveListener()
13     // get the remote data
14     getData()
15 }

The moveListener() method adds a listener to the outerCanvas element which forms the application 'border'. When this event is fired it calls moveWindow.

The getData() function calls the webservice, and specifies which method to call.

view plain print about
1public function moveListener():void
2 {
3        // mover event
4        outerCanvas.addEventListener( MouseEvent.MOUSE_DOWN, moveWindow );     
5 }
6
7 public function getData():void
8 {
9     popData.getData();
10 }
11     public function moveWindow( event:MouseEvent ):void
12     {
13        var str:String = event.target.valueOf();
14
15         // if its a datagrid then don't do the move
16         if ( str.search("displayPeople") >
= 1)
17         {
18             // Do nothing
19         }
20         else
21         {
22             stage.nativeWindow.startMove();
23         }
24     }

The moveWindow function also contains a check to see if the datagrid was the event target, as this was interfering with the functionality of the Datagrid. It would be interesting to see if anyone else has a more elegant solution to this, rather than a specific element check.

To populate our datagrid we need to use a data provider. In FLEX applications I usually use the RemoteObject function, but for AIR I've been using the WebService tag.

view plain print about
1<mx:WebService id="popData" wsdl="http://url/wld/services/phoneBook.cfc?wsdl" showBusyCursor="true" useProxy="false">
2 <mx:operation name="getData" fault="faultHandler(event)" result="resultsHandler(event)" />
3 </mx:WebService>

The final two 'chrome' functions we need are the minimize and close functions. I will detail handling custom chrome in another article.

view plain print about
1public function onMinimize():void
2     {
3         stage.nativeWindow.minimize();
4     }
5    
6     public function onClose():void
7     {
8         stage.nativeWindow.close();
9     }

Our WebService is referencing two functions. A results handler and a fault handler.

view plain print about
1public function resultsHandler(event:ResultEvent):void
2     {
3        // trace(event.result)
4        displayPeople.dataProvider = popData.getData.lastResult
5     }
6
7     public function faultHandler(event:FaultEvent):void
8     {
9        Alert.show("Error: " + event.fault.faultString, "Application Error");
10     }

The resultsHandler() simply assigns the datagrids dataprovider as the result of the WebService call. By adding DataGridColumn's to the datagrid with the right naming convention our results from the returned query object will map directly to our datagrid.

The faultHandler() function simply Alerts a user to a fault event.

Lastly I have a function that assigns the image source dynamically based on the click event in the datagrid.

view plain print about
1public function changeImage(img:String):void
2     {
3         userImage.visible = true
4         userImage.source = "http://url/wld/phonebook/" + img
5     }

So that completes the Phone Book AIR application. There are one or two tweaks I'd like to make in the image handling, but otherwise its exactly the spec I had in mind.

You can view the full code here.

TweetBacks
Comments (Comment Moderation is enabled. Your comment will not appear until approved.)
Back to top