??xml version="1.0" encoding="utf-8" standalone="yes"?> 上述3U方法是Adobe官方文档提供的。但是这3U方法不能解决ViewStack子组件大不一_ViewStack不能自动调整的问题?br>我最后是使用ActionScript动态解决的?br>在更换ViewStack的active child之间Q首先设|viewStack的大?/p>
<mx:ViewStack id="appStack"> public function changeChild() : void {
另外Qh׃是相当的不菲。Standard is $249 US, Professional costs $699.
此外Q还可以选择从flex2升上去Q升U到Standard的话Q?9元Q升U到professional?99元?br />
]]>
<mx:VBox id="v1"/>
<mx:VBox id="v2"/>
</mx:ViewStack>
appStack.width = 200;
appStack.height = 200;
appStack.selectChild = v1;
}
我错了,使用ViewStack的resizeToContent是最好的解决办法?/p>
新特?br>1. 支持AMF3, q一Ҏ疑是Ȁ动h心的.
2. 支持JSON, 除了gateway.php? 增加了json.php, 让你的服务能够用JSON.
有两个例?
http://5etdemi.com/amfphp2/samples/ajaxtables/
http://5etdemi.com/amfphp2/samples/spry/
3. 一个新的service browser
4. 在php? 不再需要写 $this->methodTable q个东东? 在amfphp 1.9 ?所有的Ҏ默认为可以远E访问,除非Ҏ名是以下划线开?或?Ҏ?private 的(只有 php5 支持Q??/p>
通常, Application对象创徏? 发生如下事g:
1. 实例化Application对象
2. 初始化Application.systemManager
3. Application在初始化q程之前, z֏预初始化事g.
4. 调用createChild(). 此时, 所有应用组件被创徏, 所有组件的createChild()被调?
5. Applicationz֏初始化事? 表明所有的lg初始化完?
6. z֏creationComplete事g
7. Application对象d到显C列表中
8. z֏applicationComplete事g
大多数情况下, 我们使用<mx:Application>来创建application对象, 但如果用ActionScript来创建的? 那么不要在application的构造函C创徏lg, 推荐在crateChildren函数? 主要是从性能斚w考虑.
Flash包含的是一个时间线上的多个? 而Flex的SWF只包?个. SystemManager, Preloader, DownloadProgressBar和少量工L都在W一? 剩下的包括应用代? 内嵌资源全都在第二? 当Flash Player下蝲下蝲SWF? 只要接收到第一帧内_的数? ׃实例化SystemManager, 由它来创建Preloader, 然后创徏DownloadProgressBar, q两个对象会察看剩余字节的传输过E? 当第一帧的所有字节传输完毕后, SystemManager发送enterFrame到第二, 然后是其他事? 最后Application对象z֏applicationComplete事g.
应用中主要包?个组? 一个TextInput, 一个Tree, 一个DataGrid, 一个Label
1. 先看Tree, Tree使用_xmlData作ؓ数据? 定义一个change事g处理函数, 当前节点存储到_xmlCur变量?
2. TextInput的数据源是_xmlCur的label属? 也就是Tree当前节点的标{? 他也定义了一个change事g处理函数, 在TextInput中的文本改变? 新的文本赋值给Tree当前节点的标{? 也就是改变当前Tree节点的标{ր? 值得注意的是赋值ƈ不是直接lTree中或者节点中的某个属? 而是通过修改数据源Xml的值来改变?
3. DataGrid的用显CZ如何在DataGrid中展CXml的技?
4. 最后一个Label只是单的昄当前节点的标{ր? 与TextInput的文本保持同?/p>
2. 增加LocaleQ错误信息的国际化的处理?br>d了一个Properties文gQ?br>d了com.adobe.cairngorm.CairngormMessageCodes和com.adobe.cairngorm.CairngormError两个c,其中CairngormMessageCodes用于定义Properties文g中的键|而CairngormError装了ErrorQ在应用执行的过E不再直接抛出ErrorQ而抛Z个CairngormErrorQ其中带一个参数就是MessageCodeQ根据MessageCode到Properties文g中取出相应的消息?/p>
3. 在business中,d了一个IServiceLocator的接?br>ServiceLocator实现IServiceLocator接口Q相比以前增加了以下几个ҎQ?br>a、public function getRemoteObject( serviceId : String ) : RemoteObject // Return the RemoteObject for the given service id.
b、public function getHTTPService( serviceId : String ) : HTTPService // Return the HTTPService for the given service id.
c、public function getWebService( serviceId : String ) : WebService // Return the WebService for the given service id.
d、public function getConsumer( serviceId : String ) : Consumer // Return the message Consumer for the given service id.
e、public function getProducer( serviceId : String ) : Producer // Return the message Produce for the given service id.
f、public function getDataService( serviceId : String ) : DataService // Return the DataService for the given service id.
g、public function setCredentials( username : String, password : String ) : void // Set the credentials for all registered services. Note that services that use a proxy or a third-party adapter to a remote endpoint will
原来的getService和getInvokerServiceҎ已经废弃Q改ZgetRemoteObject
4. 在Command中,增加了ICommand接口Q原来的Command接口l承ICommand
5. 在VO中,增加了IValueObject接口Q原来的ValueObjectl承IValueObject接口
上面d的几个接口,除了IServiceLocator相较2.0版本有了较大的变化,增加了一些方法,其他的几个接口,依我所见,Ua是换了名字而已?/p>
Cairngen是一个Caringorm的代码生成器, 它得开发者可以很方便地生成Cairngorm目的结构框? 包括: Cairngorm目的目录结? 一个缺省的ModelLocator, Controller, ServiceLocator. Cairngen也可以生成Event, Command, Delegatec?
Cairngen使用Flex2和PHP5.2.0开? 利用了AMFPHP. 安装q程十分方便. 你可以在Flex Builder的浏览器中直接运行Cairngen来快速方便地生成Cairngorm的类.
Cairngen使用'步骤(Sequence)'来描qEvent, Command, DelegatecM间的关系.
在Cairngen中只要命名一?步骤',点击一下生成按钮就可以生成一?步骤'. 然后h一下Flex目, 生成的类OK? 在一些特D的情况? 你不希望dDelegatec? 那么你可以选择排除Delegatecȝ生成, q样的话, Cairngen只生成Event和Command.
生成的Commandcd现Cairngorm的Command接口, 但不实现IResponder接口. Cairngenq能够正地事件强制性{?casting)为Coand中的cd, qimport所有相关的c?
pȝ需?
1. 了解AMFPHP, Apache2.0.59和PHP5.2.0, 在用Cairngen之前要求先安装AMFPHP, 而且gateway.php的访问虚拟目录应该如下设|? http://localhost/amfphp/gateway.php. ?.0版正式发布后, q个URL可以自由配置.
2. q需要安装Flex2, PHP, 你可以用WAMP5来集成安装Apache5.5和PHP. 安装好PHP和AMFPHP? 可以解压羃Cairngen Alpha 1. 把services目录复制到amfphp的根目录? 然后复制cairgen-ui目录到apache的www根目录下.
使用:
安装好PHP和AMFPHP? 可以开始用Cairngen? 打开览器输?a href="http://localhost/cairngen-ui/Cairngen.html">http://localhost/cairngen-ui/Cairngen.html打开生成器的囑Ş界面. 创徏Cairgen目:
点击 begin
l你的Cairngen目命名. q个名称与Flex目的名U相? 选择你的Cairngorm的版? 选择Flex目的\? 讄目中包路径(比如: com.domain.projectname). 最? 验一下输入内? 点击"Create Project". hFlex目查看~省的Cairngorm目l构, ModelLocator, Service和Controllerc?
创徏"步骤":
首先是给步骤命名, 然后选择是否要生成Delegatec? 点击生成, q刷新Flex目. 可以发现需要的cdl生成完毕了. 现在需要把它们d到Controller?
接下来编辑模板文? 你可以修Ҏ板文?.tpl)来实C的特定的Cairngorm需? 模板文g?amfphp\services\com\ericfeminella\cairngen\templates目录?
生成器下载地址: http://code.ericfeminella.com/cairngen/Cairngen%20Alpha%201%20PreRelease.zip
现在有一个方便的做法来根据选择Enable/Disable控g。比如:有一个DataGrid和数个操作数据的按钮Q当选中某行是激zd中一个按钮,选中另一行时Q激zd中另一个按钮,{等?/p>
通常的做法是写一大堆的if else语句Q或者是讄一堆变量绑定到按钮上,然后在代码中讄q些变量的|比如Q?/p>
[Bindable] private var somethingSelected:Boolean = false;
<mx:Button label="Publish" click="publishItem()" enabled="{somethingSelected}" />
q是一个有益的试。所有的依赖于DataGrid状态的控g都绑定一个变量。改变变量的值就改变控g的enabled状态。但是你q需要确定改变变量值的时机。比如:
private function publishItem() : void {
// get the selected item
// publish it
grid.selectedItem = -1; // clear the selection
somethingSelected = false;
}
在复杂的情况下,假设有另一个按钮需要在选中某个特定值时被激zR那么你不仅需要考虑选中对应的那个变量,q需要考虑其他按钮的情c也是_在publishItem函数中你q需要设|其他变量的倹{?/p>
一个更方便的做法是q样的。现在我们Publish按钮和somethingSelected变量q行l定。我们还需要做的是把somethingSelected变量与DataGrid的选中状态进行关联。对此,我们可以使用<mx:Binding>标签?/p>
<mx:Binding source="grid.selectedIndex >= 0" destination="somethingSelected" />
q样somethingSelected的gDataGrid的选中状态就紧密地联pv来了。当选中了DataGrid中的某条数据Ӟ所有进行enabled="{somethingSelected}"l定的按钮就被激zR?lt;mx:Binding>标签的source属性不需要一定是一个变量,完全可以是一个表辑ּ?/p>
比如E微复杂一点的一个例子:
<mx:Binding source="grid.selectedItem.code == 1" destination="codeOnePicked" />
q样Q当DataGrid选中行的code字段的gؓ1Ӟ变量codeOnePicked的D讄为true?br />mxml中可以如下定义:
<mx:CheckBox label="Code One?" selected="{codeOnePicked}" />
<mx:Button label="Publish" enabled="{somethingSelected && !codeOnePicked}" />
q样Q当选中行的code字段gؓ1Ӟ上面的复选框被激z,而下面的按钮无效?/p>
http://www.adobe.com/livedocs/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&file=ent_services_config_097_11.html
在Flex的序列化和反序列化过E中Q只能传递public的,非静态的属性,如果要序列化此部分内容在Flex与Java间传递,必须使用externalization机制
从我们开始学习Flex? 我们需要了解事件流和MXML的实例化. 我非常困惑因为我实在难以理解什么样的事件会被触发或者事件什么时候会被触? 关键是要理解事g的基q亲自观察事件流的初始化.
我们来看一个简单的MXML的应?
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
xmlns:mx=" layout="absolute"
backgroundGradientColors="[#67cbff, #fcffff]"
color="#000000"
fontSize="12"
preinitialize="report( event , 'preinitialize' )"
initialize="report( event , 'initialize' )"
creationComplete="report( event , 'creationComplete' )"
applicationComplete="report( event , 'applicationComplete' )"
>
<mx:Script>
<![CDATA[
[Bindable]
public var outTextData:String="";
public function report( event:Event , value:String ):void
{
outTextData += String( flash.utils.getTimer() ) + 'ms >> '
+ event.currentTarget + '.' + value + '\n';
}
]]>
</mx:Script>
<mx:TextArea
id="outTextArea"
text="{ outTextData }"
right="10" left="10" top="50" bottom="10" alpha="0.5"
wordWrap="false"
initialize="report( event , 'initialize' )"
creationComplete="report( event , 'creationComplete' )"
/>
<mx:Button
y="10" height="30" left="168" width="150"
id="HelloButton"
label="Say Hello"
initialize="report( event , 'initialize' )"
creationComplete="report( event , 'creationComplete' )"
rollOver="report( event , 'rollOver' )"
rollOut="report( event , 'rollOut' )"
click="report( event , 'click > Hello!' )"
/>
<mx:Button
id="GoodByeButton"
label="Say Goodbye"
y="10" left="10" height="30" width="150" color="#000000"
initialize="report( event , 'initialize' )"
creationComplete="report( event , 'creationComplete' )"
click="report( event , 'click > Goodbye!' )"
/>
<mx:Button
id="ClearButton"
label="Clear"
y="10" left="326" height="30" color="#000000" right="10"
initialize="report( event , 'initialize' )"
creationComplete="report( event , 'creationComplete' )"
click="outTextData='';report( event , 'click' )"
/>
</mx:Application>
q个应用q行? 输出了实例流E和事g? q校我们p够看到所有事件的触发序. 可以发现应用启动? 事g的顺序是一定的. 下面是输出的内容:
167ms >> EventFlow0.preinitialize
183ms >> EventFlow0.outTextArea.initialize
187ms >> EventFlow0.HelloButton.initialize
188ms >> EventFlow0.GoodByeButton.initialize
189ms >> EventFlow0.ClearButton.initialize
189ms >> EventFlow0.initialize
243ms >> EventFlow0.outTextArea.creationComplete
243ms >> EventFlow0.HelloButton.creationComplete
243ms >> EventFlow0.GoodByeButton.creationComplete
244ms >> EventFlow0.ClearButton.creationComplete
244ms >> EventFlow0.creationComplete
246ms >> EventFlow0.applicationComplete
一旦applicationComplete事g触发? lg׃在鼠标事件派发后触发自己的事?
1807ms >> EventFlow0.HelloButton.rollOver
2596ms >> EventFlow0.HelloButton.rollOut
2954ms >> EventFlow0.HelloButton.rollOver
3170ms >> EventFlow0.HelloButton.rollOut
3543ms >> EventFlow0.HelloButton.rollOver
4052ms >> EventFlow0.HelloButton.click > Hello!
4267ms >> EventFlow0.HelloButton.click > Hello!
4474ms >> EventFlow0.HelloButton.click > Hello!
4569ms >> EventFlow0.HelloButton.rollOut
4907ms >> EventFlow0.GoodByeButton.click > Goodbye!
5130ms >> EventFlow0.GoodByeButton.click > Goodbye!
在ActionScript 3中,你会发现在flash.utils包中有一pd函数提供了反的功能。主要包含以下功能:
* 定对象的类
* 获取cȝ成员、方法、构造函数、父cȝ信息
* 定接口声明的常数和Ҏ
* 在运行时Ҏcd创徏cȝ实例
* 在运行时Ҏ成员名称获取或者设|对象成员的?br /> * 在运行时ҎҎ名称Q调用对象的Ҏ
你可以用类g"describeType"之类的功能,它返回一个Xml对象。D一个例子:
package {
import flash.display.Sprite;
import flash.utils.describeType;
public class DescribeTypeExample extends Sprite {
public function DescribeTypeExample() {
var child:Sprite = new Sprite();
var description:XML = describeType(child);
trace(description..accessor.@name.toXMLString());
}
}
}
如果你想q一步,Ҏcd创徏对象的实例,我们可以使用"getDefinitionByName()"
package {
import flash.display.DisplayObject;
import flash.display.Sprite;
import flash.utils.getDefinitionByName;
public class GetDefinitionByNameExample extends Sprite {
private var bgColor:uint = 0xFFCC00;
private var size:uint = 80;
public function GetDefinitionByNameExample() {
var ClassReference:Class = getDefinitionByName(“flash.display.Sprite? as Class;
var instance:Object = new ClassReference();
instance.graphics.beginFill(bgColor);
instance.graphics.drawRect(0, 0, size, size);
instance.graphics.endFill();
addChild(DisplayObject(instance));
}
}
}
管q是一些非常方便的ҎQ但是在FlashPlayer中用反还是会有许多的限制Q因为缺乏运行时的动态源码编译。上面的功能对于那些在内建的c,比如QSpritecL说无疑是有用的,但是对于自定义类来说Q我们会遇到很多ȝ。比如:
package {
import com.customtypes.string; // Custom String Implementation Class
import flash.utils.getDefinitionByName;
public class GetDefinitionByNameExample {
public function GetDefinitionByNameExample() {
var ClassReference:Class = getDefinitionByName(“com.customtypes.string? as Class;
var instance:Object = new ClassReference();
instance.customParameter = “my parameter?
}
}
}
管我们使用了import语句Q但?getDefinitionByName()"q是会失败。原因上面已l说q了Q在q行时编译源代码是不允许的。也总后可以。在目前情况下,要实Cq功能,臛_要在代码中初始化一个类的实例。也是声明一个类的实例:
var customType : com.customtypes.string;
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Script> <![CDATA[ public var foo:String = "bar"; ]]> </mx:Script> </mx:Application>
在其它的地方可以?
Application.application.foo
来访问了. 如果需? 也可以添?Bindable 属?
但是要注意到一个问题就? 在用的时候编译器不会q行cd的检? 因此最好添加类型强制{?
当然, 全局变量实现的另一U方法是使用单例模式.
q译器自动选择一个非常好的打包方法是比较困难的。很可能需要在应用开发时q行一些设定,q不时地监控cȝ引用。能够统计出最优的分拆ҎQ应用应该分成几个SWFQ哪些类应该攑֜哪个SWF中。但是这U方法听h更象是一U研I范_实际操作h非常困难?/p>
让我们来看一些更h操作性的Ҏ?/p>
很多应用分解后,包含两种cd的功能:“启动后立即填充”和“启动后E后填充”?/p>
有许许多多的应用是这U模式的。比如:游戏Q你有一个游戏引擎和一些游戏场景。或者Portals和Porlets; 一些基的共享功能和数据驱动的小应用。或者是一个大型的有着1500个页面的保险应用Q运行特定功能是只会讉K一部分的面。或者是充斥大量内容的应用,它可以独立的更新部分内容而不是强制用hơ浏览时都必M载全部内宏V?/p>
我称q些相对独立的可以gq加载的功能为“模块?Modules)Q称加蝲模块的应用ؓ“Shell”?/p>
在这里,我们先不看如何做Q先来看一?/p>
shell需要能够与模块交互Q同h块也需要和Shell交互。如果shell引用了modules的一个类Q那么它会把它链接进来。同P如果模块cd用了shellc,它也会把它链接进来。应用能正常q行只有两个ҎQ或者引用是相同而且׃n?q样׃需要下载两?Q或者两者是不同的,而且没有M关系(管两个cd字相同,但是它们被认为是无关的,而且不能交互)?/p>
最好的解决办法是让模块和shell通过接口交互。这Pshell不需要引用模块,而是引用模块会实现的一些接口。同P模块不实现shell的类Q而是允许调用的API接口?/p>
q样在shell变化的时候减了重新~译模块的次数。具体实现的变化频率往往会比接口本n的变化高得多Q而只要接口稳定,׃需要重新编译所有的东西?/p>
注意Q需要用externQ或者extern-library-path)选项来创建模块,q样可以自动剔除shell的类Q因为模块是被加载到shell的子应用域中的,shell的类剔除是安全的。这h块可以真正直接引用shell中的cR?/p>
CSWC文g是一个包含SWF文g的二q制文gQ而SWF文g包含q行时的定义和附属元数据。你可以用压~工h如WinZip来打开SWC文g?br />在用RSL之前Q首先需要了解如何静态链接一个SWC文g?/p>
在这个例子中Q应用有一个app.mxml文gQ用ProductConfigurator.as和ProductView.as。文件目录如下:
project/src/app.mxml
project/libsrc/ProductConfigurator.as
project/libsrc/ProductView.as
project/lib/
project/bin/
~译q个应用Ӟ可以使用source-path选项?libsrc目录下的c链接进来,Ҏ如下Q?/p>
cd project/src
mxmlc -o=../bin/app.swf -source-path+=../libsrc app.mxml
q个命odProductConfigurator和ProductViewcdSWF文g中?/p>
如果要创建库Q可以用compc来创建SWC文gQ用下面的命令:
cd project
compc -source-path+=libsrc -debug=false -o=lib/mylib.swc
ProductConfigurator ProductView
注意要将debug选项讄为false. 生成l果是project/lib/mylib.swc文gQ包含ProductConfigurator和ProductView两个cR?/p>
现在可以使用新创建的库来重新~译应用Q用library-path选项来指定库Q方法如下:
cd project/src
mxmlc -o=../bin/app.swf -library-path+=../lib/mylib.swc app.mxml
创徏库以后,你可以用RSL来重新编译生成应用。完整的步骤如下Q?/p>
1. 指示~译器不要将库链接到应用中?br /> 2. 准备RSLQ以便于在运行时使用?br /> 3. 指示~译器生成附加元数据用于加蝲RSL?/p>
W一步是指定~译生成应用时库中的哪些c需要排除在外。主要是使用external-library-path选项Q如下面的例子所C:
cd project/src
mxmlc -o=../bin/app.swf -external-library-path+=../lib/mylib.swc app.mxml
如果你尝试运行app.swfQFlash Player会抛Z个运行时异常。因为ProductConfigurator和ProductViewc还未定义。external-library-path配置选项告诉~译器编译这些库Q但是忽略了定义。你也可以用externs选项Q但是一般来_使用external-library-path更方ѝ?/p>
下一步是准备RSL以便于能在运行时扑ֈ它。首先从SWC文g中将library.swf解压出来?/p>
下面是如何解压的例子Q?/p>
cd project/lib
unzip mylib.swc library.swf
mv library.swf ../bin/myrsl.swf
此例子中library.swf更名为myrsl.swfQƈ把它Ud到应用SWF文g所在的目录?/p>
最后一步是使用RSL重新~译应用。主要是使用runtime-shared-libraries选项Q方法如下:
cd project/src
mxmlc -o=../bin/app.swf -external-library-path+=../lib/mylib.swc
-runtime-shared-libraries=myrsl.swf app.mxml
现在新的SWF文g会在q行应用前动态加载RSL了?/p>
* runtime-shared-libraries 提供q行q行时共享库的位|?
* external-library-path|externs|load-externs 提供~译时库的位|? ~译器需要这个信息动态链?
使用runtime-shared-libraries选项来指定SWF文g的位|? q样应用能够在运行时加蝲RSL. 需要指定SWF与部|位|的相对路径. 比如: 如果把library.swf文g攑֜web_root/libraries目录? 而应用在web_root目录? 那么文g的指定方法是: libraries/library.swf
可以用这个选项指定多个? 如果指定了多个库, 需要用逗号分隔.
使用external-library-path选项来指定library在编译时的SWC文g或者目录的位置. ~译器会在编译时Ҏq个选项q行链接的检? 你还可以使用externs或者load-externs选项来指定其他单独的classes或者xml文g来定义库的内?
下面是一个编译MyApp应用的命令行CZ, 其中使用?个库:
mxmlc -runtime-shared-libraries=
../libraries/CustomCellRenderer/library.swf,
../libraries/CustomDataGrid/library.swf
-external-library-path=../libraries/CustomCellRenderer,
../libraries/CustomDataGrid MyApp.mxml
库的序非常重要, 因ؓ基础cdd加蝲.
你先可以使用配置文g, CZ如下:
<compiler>
<external-library-path>
<path-element>../libraries/CustomCellRenderer</path-element>
<path-element>../libraries/CustomDataGrid</path-element>
<path-element>../libs/playerglobal.swc</path-element>
</external-library-path>
</compiler>
<runtime-shared-libraries>
<url>../libraries/CustomCellRenderer/library.swf</url>
<url>../libraries/CustomDataGrid/library.swf</url>
</runtime-shared-libraries>
runtime-shared-libraries选项值是library.swf文g是相寚w|目录的路径. external-library-path选项是编译时SWC文g的\? 因此, 必须先知道库的部|\?
CZ? ~译时文件结构如?
c:/appfiles/MyApp.mxml
c:/libraries/CustomCellRenderer/CustomCellRenderer.swc
c:/libraries/CustomDataGrid/CustomDataGrid.swc
library.swf在编译进不是必需? Flex~译器不验证SWF文g的存在与? 但会把\径信息编译进行最后的应用代码?
文g的部|结构如?
web_root/MyApp.swf
web_root/libraries/CustomCellRenderer/library.swf
web_root/libraries/CustomDataGrid/library.swf
可以使用Flex Builder或者Compc命o行来创徏? 库可以是一个SWC文g, 或者是包含了library.swf和catalog.xml文g的目? 一个库通常包含自定义组件和c? 然后可以在RSL中用这些库?
在Flex Bulder? 通过使用Flex Library Build Path对话框来d资源到库?
在命令行? 使用include-classes和include-namespaces选项来添加文件到库中.
下面的命令行CZ说明了如何创Z个名字叫CustomCellRenderer的库:
compc -source-path ../mycomponents/components/local
-include-classes CustomCellRendererComponent -directory=true -debug=false
-output ../libraries/CustomCellRenderer
所有包含的lg必须是静态链接的文g. 使用compc~译器创建库? 不能使用include-file选项, 因ؓq个选项不是library.swf文g静态链接到库中?
可以使用directory选项指定输出C个目录而不是到一个SWC文g?
<?xml version="1.0">
<flex-config>
<compiler>
<source-path>
<path-element>mycomponents/components/local</path-element>
</source-path>
</compiler>
<output>libraries/CustomCellRenderer</output>
<directory>true</directory>
<debug>false</false>
<include-classes>
<class>CustomCellRendererComponent</class>
</include-classes>
</flex-config>
输出会是一个目?目录里包含两个文?br /> * catalog.xml
* library.swf
创徏library.swf文g? 你可以编译应用ƈ且指定文件的位置.
Flex and Flash provide a complete, unlimited, flexible tool to build user experiences. From the standpoint of a programmer’s time investment, you can learn a single language for building UIs without worrying about running into problems or limitations later—issues like:
原文链接:
http://www.artima.com/weblogs/viewpost.jsp?thread=193593
Computing Thoughts
Hybridizing Java
by Bruce Eckel
January 30, 2007
RSL也不是对于所有的应用都是有益? 需要对应用RSL前后的下载时间和启动旉都测试过, 才能得到正确的结?
RSL不能跨域׃n. 如果客户在一个域中用了RSL, 然后q行了另一个域的应? 虽然q两个RSL是相同的, 但是需要下载两?
RSL通常会增加应用的启动旉. q是应用不管整个库实际如何? 只是单地全部加蝲整个? p一Ҏ? RSL小好. q与静态链接库的用是不同? 当你~译一个Felx应用? ~译器只解开需要的lg. 一般来? 库的大小可以是Q意的, 它只影响~译旉而不会媄响下载的旉.
如果在好几个应用中用相同的lg? 那么可以考虑合ƈq些? 形成一个RSL. 但是如果库合q后, 每个应用只会用到其中的一部? 那么q不如多加蝲几个RSL更高?
如果一些类重复打包在多个RSL? 那么一定要注意同步更新的问?
RSL不能应用在基cLSprite或者MovieClip的纯ActionScript目? 因ؓRSL需要基cȝ道如何加载RSL, 比如: Application或者SimpleApplication.
关于 framework.swc文g
framework.swc是一个标准的SWC文g. ~省地它不能用作RSL. 整个framwork.swc文g不被链接CQ何一个应用中. Flex~译器只那些应用用到的部分链接到生成最后的SWF文g. 比如: 如果一个应用只使用了Button, Panel和TextArea控g, 那么只有q几个控件和它们的依赖项被编译器链接.
几乎所有的应用都需要framework.swc文g的一部分, 但是它ƈ不适合作ؓRSL. 原因如上据说, RSL是整个链? 不管实际使用多少? 如果RSL包含了很多类, 而应用只使用了其中的一部? 那么q样的加载方式ƈ不是最合理? q样使用会造成应用的启动时间大大增?
RSL的优?/p>
下面的一个例子说明了几个的׃nlg做成RSL的优? 在这个例子中, lg库的大小?50K, ~译后的应用的大是100K.
使用了RSL, RSL只被下蝲一? 那么合计下蝲量是350K, 节约?0%. 如果再添加第3? W?个应用的? 每次都能150K的下载量.
一般来? 在一个域中用同一个RSL的应用越? 那么好处p?
当你使用静态链接时, ~译器将应用中所有引用的cd依赖生成到最l的SWF文g? q个文g会比较大, 下蝲也会比较? 但是下蝲完毕? q行会比较快, 因ؓSWF文g中已l包含了所有的代码.
如果你的应用中用了cd, 那么你需要用类路径或者是dSWC文g. 如果是用类路径, ~译器会类路径中用到的那部分类打包生成到SWF文g? 如果是用SWC文g, ~译器会整个SWC文g打包到SWF文g?
动态链接是q样? 一个应用要使用的一部分cd在于一个外部的文g? q行时动态加? q样的话, 主SWF文g可以一? 但是应用依赖于运行时加蝲的外部文? RSL是使用动态链接的.
如果想用动态链接类, 需要把它们~译成库. 然后~译器将库中的内容从SWF文g剔除出去. 而且必须在编译时提供链接?
为指定哪些文件是动态链接的,需要用外部库路径选项,外部选项或者外部加载编译选项. q些选项告诉~译器从应用中去除此部分内容, 而预备在q行时调? 外部选项为动态链接指定了单独的类. 外部加蝲选项指定了一个XML文g, 描述了动态链接的c?
指定SL的外部资源的序是非常关键的, 因ؓ被其他类调用的基cd被首先加蝲.
你还要用runtime-shared-libraries选项来指定RSL的位|?
你可以用link-reportq个~译选项来查看应用的链接信息.
如果你有多个应用而且q些应用׃n一些核心组件或者类, 那么作ؓRSL,用户只会唯一的一ơ加载这些资? 只要应用在同一个域? q些应用׃n同一个缓存的RSL, q样应用文g的大就减小? 使用RSL的应用越? 效果好, 如果只有一个应? ȝ文g大小不但不减?反而会增大.
你既可以使用Flex Builder通过目选项来创建Flex的Library目,也可以用compcq样的命令行. ~译好RSL以后, 可以在编译应用时把Library的位|传递给~译?
下面是适合使用RSL的典型用?
* 大型应用, 需要用通用lg库加载多个小型应? 最的应用和下应用可以׃n存储在RSL中的lg.
* 在一个服务器上的使用通用lg库的pd应用. 当用h作第一个应用时, 用户下蝲应用的SWF文g和RSL. 当操作第二个应用? 用户只需要下载应用本w的SWF文gp?
* 一个独立的应用使用RSL的意义在? 如果q个应用本n会频J的修改, 而有一部分lg是极改动的. 在这U情况下, 使用RSL的好处是: lg下蝲一? 而应用可以多ơ下?
3) 也不要用*cd?/p>
4) 不要ActionScript的类声明为动态?/p>
5) 注意Application.application (和其他的无类型的框架属?. q个属性有一些古? 他应该是Applicatoncd的,因ؓ他指向的实例必须是Application的子c? 但实际上他的cd?Object', 无法应用~译时的查。如果你一定要用,最好也q行cd的强制性{换?
MyApplication( Application.application ).functionCall();
6) 装你的Xml。用Xml与Serverq行数据的交互非常方便,但是量避免使用Xml作ؓ核心数据模型。从服务器收到数据后Q尽量把Xml转换为强cd的对象模型。在Flex应用内部使用Xml是绕开~译器的作法?
7) 不要使用DynamicEvent.
8) 不要使用mx:Model。如上所qͼ请尽量用自定义的强cd的类.
9) 不要使用Cairngorm中的data属性,而应该承扩展CairngormEvent来传递数据?/p>
10) 不要把编译器的严格模式关?/p>
var label:String = childItem[tree.labelField];
var branch:Boolean = descriptor.isBranch(childItem);
// good place for a custom method()
trace("Sibling Nodes :: ", label, "Is Branch :: ", branch);
// if the child item is a branch
if(descriptor.isBranch(childItem))
// traverse the childs branch all the way down
// before returning
walkTree(tree, childItem);
// do it again!
cursor.moveNext();
}
}
}
}
else// we don't want the parent OR this is the second iteration
{
// if we are a branch
if(descriptor.isBranch(item))
{
// if the branch has children to run through
if(descriptor.hasChildren(item))
{
// get the children of the branch
childItems = descriptor.getChildren(item);
}
// if the child items exist
if(childItems)
{
// create our cursor pointer
cursor = childItems.createCursor();
// loop through all of the children
// if one of these children are a branch we will recurse
while(!cursor.afterLast)
{
// get the current child item
childItem = cursor.current;
var label:String = childItem[tree.labelField];
var branch:Boolean = descriptor.isBranch(childItem);
// good place for a custom method()
trace("-- Sub Node :: ", label, "Is Branch :: ", branch);
// if the child item is a branch
if(descriptor.isBranch(childItem))
// traverse the childs branch all the way down
// before returning
walkTree(tree, childItem);
// check the next child
cursor.moveNext();
}
}
}
}
}
在Flex的开发过E中Q尤其是在用Cairngorm的时候,M遇到需要在Model的属性值改变后Q需要调用一个指定的函数。传l的解决Ҏ是用一个SetterҎQ在q个Ҏ中首先对属性赋|然后调用指定的函敎ͼ比如Q?/p>
---------------------------
[ChangeEvent("deleteEnabledChange")]
public function get deleteEnabled() : Boolean {
return _deleteButtonVisible;
}
public function set deleteEnabled(value : Boolean) : Void {
_deleteButtonVisible = value;
SimpleButton(deleteButton)._visible = false;
dispatchEvent(new Event("deleteEnabledChange", this));
}
--------------
但是现在我们有一个更z的解决之道
首先dq样一个类
package com.adobe.ac.util
{
public class Observe
{
public var handler : Function;
public function set source( source : * ) : void
{
handler.call();
}
}
}
然后可以用这个作为标{了?br /><util:Observe source="{ model.myProperty }"
handler="{ this.myFunction }"/>
使用了这L一个标{Q今后嘦是对model.myPropertyq行赋|׃调用myFunction
q个L世上最的标签是不是很好用啊?