I've just started learning flex using OReilly "Programming Flex 3.0". After completing three chapters and starting fourth (ActionScript), and not having enough patience to wait till completing chapter 22 I started to practice :)
One bit that I have most worries about right now is the the dual coding mode (MXML vs ActionScript)
Please have a look at my code below (it compiles via mxmlc design.mxml, second file 'code.as' should be in same directory) and advise if the separation I used between visual design and code is appropriate.
Also - if some smart guy could show me how to recode same example with *.as being a class file [package?] it would be highly appreciated. I got lost with creating directory structure for package - and did not find it most intuitive, especially for small project that has two files like my example.
Code: design.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script source="code.as"/>
<mx:VBox>
<mx:TextInput creationComplete="initializeCalculator()" id="txtScreen"/>
<mx:HBox>
<mx:Button click="click('7')" id="btn7" label="7"/>
<mx:Button click="click('8')" id="btn8" label="8"/>
<mx:Button click="click('9')" id="btn9" label="9"/>
<mx:Button click="click('C')" id="btnClear" label="C"/>
</mx:HBox>
<mx:HBox>
<mx:Button click="click('4')" id="btn4" label="4"/>
<mx:Button click="click('5')" id="btn5" label="5"/>
<mx:Button click="click('6')" id="btn6" label="6"/>
<mx:Button click="click('/')" id="btnDivide" label="/"/>
</mx:HBox>
<mx:HBox>
<mx:Button click="click('1')" id="btn1" label="1"/>
<mx:Button click="click('2')" id="btn2" label="2"/>
<mx:Button click="click('3')" id="btn3" label="3"/>
<mx:Button click="click('*')" id="btnMultiply" label="*"/>
</mx:HBox>
<mx:HBox>
<mx:Button click="click('0')" id="btn0" label="0"/>
<mx:Button click="click('=')" id="btnEqual" label="="/>
<mx:Button click="click('-')" id="btnMinus" label="-"/>
<mx:Button click="click('+')" id="btnPlus" label="+"/>
</mx:HBox>
</mx:VBox>
</mx:Application>
code: code.as
public var res:int = 0;
public var previousOperator:String = "";
public var previousRes:int=0;
public function initializeCalculator():void{
txtScreen.text = res.toString();
}
public function click(code:String):void{
if (code=="1" || code=="2" || code=="3" || code=="4" || code=="5" ||
code=="6" || code=="7" || code=="8" || code=="9" || code=="0"){
res = res*10 + int(code);
txtScreen.text = res.toString();
}
else if (code=="C"){
res = 0;
previousOperator ="";
previousRes = 0;
txtScreen.text = res.toString();
}
else{
calculate(code);
}
}
public function calculate(operator:String):void{
var tmpRes:int;
if (previousOperator=="+"){
tmpRes = previousRes + res;
}
else if (previousOperator=="-"){
tmpRes = previousRes - res;
}
else if (previousOperator=="/"){
tmpRes = previousRes / res;
}
else if (previousOperator=="*"){
tmpRes = previousRes * res;
}
else{
tmpRes = res;
}
previousOperator = operator;
previousRes =开发者_JAVA技巧 tmpRes;
txtScreen.text = previousRes.toString();
res = 0;
if (previousOperator=="=")
{
res = tmpRes;
txtScreen.text=res.toString();
}
}
PS. If you have comments that this calculator does not calculate properly, they are also appreciated, yet most important are comments on best practices in Flex.
This example on using code-behind in a Flex application should be helpful in cleaning up the link between your user interface and the application logic.
I normally write the code in a CDATA
block inside the <mx:script/>
tag itself.
<mx:Script source="code.as">
<![CDATA[
//code here
]]>
</mx:Script>
This is the way it is done in most of the tutorials and Adobe code samples out there. An mxml file represents an ActionScript class
(the file design.mxml creates a class named design
in the root package) and hence I believe it makes sense to put the whole code in one place (file) - this is a matter of choice though.
If user interface parts in a component are minimal, you can create that component using just an AS file. Checkout the code for a panel with a text input and a button in it:
//MyPanel.as inside /your/folder/structure
package your.folder.structure
{
//import appropriate classes here
public class MyPanel extends Panel
{
[Bindable]
public var txt:TextInput;
[Bindable]
public var btn:Button;
public function MyPanel(){}
override protected function createChildren():void
{
txt = new TextInput();
txt.text = "Default text";
txt.setStyle("color", 0xffff00);
addChild(txt);
btn = new Button();
btn.label = "Click me!"
btn.addEventListener(MouseEvent.CLICK, handleClick);
addChild(btn);
}
private function handleClick(e:MouseEvent):void
{
trace("clicked");
}
}
}
And the (almost) equivalent mxml code would be:
<!-- MyPanel.mxml inside /your/folder/structure -->
<?xml version="1.0" encoding="utf-8"?>
<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns="your.folder.structure.*">
<mx:TextInput id="txt" text="Default text" color="#ffff00"/>
<mx:Button id="btn" label="Click me!" click="handleClick(event);"/>
<mx:Script source="code.as">
<![CDATA[
private function handleClick(e:MouseEvent):void
{
trace("clicked");
}
]]>
</mx:Script>
</mx:Panel>
精彩评论