爲了讓你的MXML代碼可讀性增強,你可以在<mx:Script>標籤內引用ActionScript代碼文件,而不是把大塊的代碼都插入到<mx:Script>裏。引用ActionScript有include和import兩種方式。
在ActionScript中include和import有着截然不同的區別。Include是將一個文件中的代碼拷貝到另一個文件中去,也就是將代碼拷貝到include語句所在的位置上。Import是添加了對類或包的引用,這樣你就可以訪問其他的類中定義的對象和屬性。通過import導入的代碼文件必須存在於你導入的路徑上。通過include導入代碼文件,輸入的文件地址必須與主文件要能在相對路徑上尋找到,或者通過絕對路徑也可以。
你可以在你的Flex應用程序中使用include語句和< mx:Script source="filename">標籤來添加ActionScript代碼。
你可以在<mx:Script>內使用import語句來引用你的Flex應用程序中可能需要的類和包。
你可以在<mx:Script>標籤內通過引用外部的ActionScrit文件來引入ActionScript代碼。在編譯的時候,編譯器會將整個代碼文件中的內容拷貝到你的MXML程序中,就像你真的在標籤內寫了代碼一樣。在<mx:Script>代碼塊中,ActionScript語句只能在函數內部。引入的代碼文件也可以定義靜態變量和命名空間,引入其他的ActionScript文件,導入聲明定義,和使用命名空間。但你不能將要導入的文件定義爲類。
引入的ActionScript文件中定義的變量和函數可以允許給MXML文件中的任何組件使用。引入的ActionScript文件的名字不能與導入的ActionScript類的名字一樣。Flex可以訪問導入的文件中的變量和函數,但不能添加新的類(本人理解爲被導入的文件不能是個類),因爲MXML文件本身就是一個類。
導入的AS文件不一定非要和MXML文件在同一個目錄下。然而,你必須讓你的程序能夠在目錄結構上正確識別到你的ActionScript代碼文件。
下面有兩種方法能在Flex應用程序中引入外部的ActionScript文件:
§ 使用<mx:Script>標籤的source屬性。這是引入外部ActionScript代碼文件的首選方法。
§ 在<mx:Script>代碼塊中使用include語句。
使用source屬性來引入ActionScript文件
你可以在Flex應用程序中使用<mx:Script>標籤的source屬性來引入外部的ActionScript文件。這種方式可以讓你的MXML文件中的代碼不那麼零亂而且還可以提高代碼的可重用性。
不要讓代碼文件與程序文件的名字一樣。這樣會讓編譯器報錯。
下面的是IncludedFile.as文件的內容:
// usingas/includes/IncludedFile.as
public function computeSum(a:Number, b:Number):Number {
return a + b;
}
下面例子中引入了IncludedFile.as文件中的內容。該文件是在引入它的文件的子目錄下。
<?xml version="1.0"?>
<!-- usingas/SourceInclude.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script source="includes/IncludedFile.as"/>
<mx:TextInput id="ta1st" text="3" width="40" x="170" y="24" textAlign="right"/>
<mx:TextInput id="ta2nd" text="3" width="40" x="170" y="52" textAlign="right"/>
<mx:TextArea id="taMain" height="25" width="78" x="132" y="82" textAlign="right"/>
<mx:Button id="b1" label="Compute Sum"
click="taMain.text=String(computeSum(Number(ta1st.text), Number(ta2nd.text)));"
x="105"
y="115"
/>
<mx:Label x="148" y="52" text="+" fontWeight="bold" fontSize="17" width="23"/>
</mx:Application>
<mx:Script>標籤的source屬性支持相對路徑和絕對路徑兩種方式。
你不能在同一個<mx:Script>標籤內既使用source屬性又寫ActionScript代碼。如果需要這麼做的話,需要使用兩個<mx:Script>標籤。
Include指令一個ActionScript語句,可以把指定的文件中的內容拷貝到MXML文件中去。Include指令的語法如下所示:
include "file_name";
下面的例子中引入了myfuncitons.as文件:
<?xml version="1.0"?>
<!-- usingas/IncludeASFile.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script><![CDATA[
/* myfunctions.as文件定義了兩個返回字符串的函數 */
include "includes/myfunctions.as";
]]></mx:Script>
<mx:Button id="myButton"
label="Call Methods in Included File"
click="ta1.text=doSomething();ta1.text+=doSomethingElse()"
/>
<mx:TextArea width="268" id="ta1"/>
<mx:Button label="Clear" click="ta1.text=''"/>
</mx:Application>
你可以讓每個include指令都指向單一個文件,也可以使用任意多的include指令語句。Include指令可以嵌套使用。通過include指令引入的文件中也可以通過使用include指令引入其他的文件。
Include指令僅僅支持相對路徑。
Include指令只能在允許多條語句執行的地方使用。例如,下面的例子就是錯誤的:
if (expr)
include "foo.as"; //IF語句的後面的第一條語句可以執行,剩下的語句都不行
...
下面的例子是正確的:
if (expr) {
include "foo.as"; // IF後的{}內的所有語句都可以執行
}
花括號中允許使用多條語句所以你可以在花括號中添加多條語句。
Adobe建議:儘量不要使用include指令來引用大量的ActionScript文件。你應該將代碼分成不同類文件中,然後將這些類文件存放在合適的邏輯包結構中。
<mx:Script>標籤的source屬性與include指令引用文件的方式各有不同。
下面闡述的就是<mx:Script>標籤的source屬性引用外部文件時的有效的路徑:
§ 相對URL,例如../myscript.as。沒有以斜線開頭URl決定了文件的相對路徑。如果<mx:Script source="../IncludedFile.as">包含在"mysite/myfiles/myapp.mxml,"裏,系統會尋找"mysite/IncludedFile.as"。
ActionScript中的include指令只能引用相對的URL。Flex會從源代碼路徑中尋找導入的類和包。Flex不會從源代碼路徑中尋找那些包含了include指令的文件或<mx:Script>標籤的source屬性引用的文件。
導入類和包
如果你創建了多個公用類或者存放了常用函數的ActionScript文件,你可能希望將它們存儲在包內的一組類中。你可以使用import語句來導入AcionScript類和包。導入之後,當你使用ActionScript來訪問類的時候你不用輸入完整的類名。
下面的例子中導入了MyPackage.Util包內的MyClass類:
<?xml version="1.0"?>
<!-- usingas/AccessingPackagedClasses.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script><![CDATA[
import MyPackage.Util.MyClass;
private var mc:MyClass = new MyClass;
]]></mx:Script>
<mx:Button id="myButton" label="Click Me" click="myButton.label=mc.returnAString()"/>
</mx:Application>
在這段代碼中,取代使用完整類名(MyPackage.Util.MyClass)來引用類的是你可以使用MyClass來引用類。
你也可以使用通配符(*)來導入整個包。例如,下面的語句就是導入了整個MyPackage.Util包:
import MyPackage.Util.*;
Flex會搜尋導入的文件和包,並且只導入那些被最終生成的SWF文件用到的類和包。
簡單的定義完整的類名是不夠的。你應該在僅僅當需要區別兩個在不同的包內的但有同樣名字的類的時候使用完整的類名。
如果你在程序中導入了類但並沒有使用它,那麼這個類就不會編譯到最終生成的SWF文件的字節代碼中去。因此,使用通配符(*)導入整個包並不能增加SWF文件的大小。