(1) Loader
Loader 類可用於載入 SWF 檔案或影像(JPG、PNG 或 GIF)檔案。 使用 load() 方法來啟動載入。 被載入的顯示物件將作為 Loader 物件的子級新增。
(2)URLLoader
URLLoader 類以文字、二進位制資料或 URL 編碼變數的形式從 URL 下載資料。 在下載文字檔案、XML 或其它用於動態資料驅動應用程式的資訊時,它很有用。URLLoader 物件會先從 URL 中下載所有資料,然後才將資料用於 ActionScript。 它會發出有關下載進度的通知,通過 bytesLoaded 和bytesTotal 屬性以及已排程的事件,可以監視下載進度。在載入非常大的視訊檔案(如 FLV 的視訊檔案)時,可能會出現記憶體不足錯誤。
Loader 類可用於載入 SWF 檔案或影像(JPG、PNG 或 GIF)檔案。 使用 load() 方法來啟動載入。 被載入的顯示物件將作為 Loader 物件的子級新增。
(2)URLLoader
URLLoader 類以文字、二進位制資料或 URL 編碼變數的形式從 URL 下載資料。 在下載文字檔案、XML 或其它用於動態資料驅動應用程式的資訊時,它很有用。URLLoader 物件會先從 URL 中下載所有資料,然後才將資料用於 ActionScript。 它會發出有關下載進度的通知,通過 bytesLoaded 和bytesTotal 屬性以及已排程的事件,可以監視下載進度。在載入非常大的視訊檔案(如 FLV 的視訊檔案)時,可能會出現記憶體不足錯誤。
區別:一個用來載入可顯示資料,一個用來載入非顯示資料因為loader是繼承與容器類的,所以首先它是個容器,而URLLoader 是繼承與EventDispatcher,它不是容器URLLoader 類以文字、二進位制資料或 URL 編碼變數的形式從 URL 下載資料,在載入非常大的視訊檔案(如 FLV 的視訊檔案)時,可能會出現記憶體不足錯誤,返回的資料在data屬性裡面而loader多載入圖片,swf等視覺化物件,載入後作為唯一的子物件顯示在列表上。
應用範圍
Loader: 多用於swf,圖片(jpg,png,gif)
URLLoader: 多用於文字檔案(xml,php,jsp…)
使用方法
Loader
在使用Loader來載入資料時,新增偵聽事件時,注意一定要給Loader的 contentLoaderInfo屬性增加事件,而不是給Loader物件增加事件。
(3)可以使用SWFLoader和Loader兩個類來載入子應用程式,多數情況下我們使用SWFLoader。它是Loader的一個包裝類,提供了很多附加功能,使載入子應用程式更簡單。
SWFLoader有如下特徵:
支援flex的樣式和特效;而Loader類卻不支援任何固有的樣式和特效。
方便管理載入進度;如果使用Loader則首先要獲取LoaderInfo引用。
是一個UIComponent元件。SWFLoader它自己管理了所有子顯示物件,不需要新增多餘的程式碼。
自動縮放顯示內容的大小
可以載入Application以外的實現類,如果檢測到不是一個Application,會自動進行處理。
可以處理不同的版本。Loader不支援載入不同的編譯版本
當使用Loader載入不是受信任區域的swf時,必須提供一個遮罩來重新定位,否則它會顯示在螢幕外面:
程式碼
SWFLoader載入外部swf是一個很好的方法,在進行Flex遊戲開發的時候,我們通常會需要很多Flash提供的遊戲角色,這些角色可以每個都是一個單獨的swf,也可以是存在於一個swf檔案中的各個元件。兩種方法各有優劣:
1. 單獨的swf,每個角色獨立性很強,可以在需要的時候才載入。未來修改角色也不會影響到其它角色。但是會有很多的swf需要管理。
2. 每個角色是一個元件,存在於一個swf中,這種方法比較容易管理資源,比較乾淨。但是修改一個角色都需要重新編譯swf,可能會誤操作影響其它的元件。而且一次載入所有角色,可能會載入許多不必要的元件,浪費頻寬。
兩種方法怎麼選擇,根據專案讀者根據以下幾個問題考慮:
1. 你的所有元件相互之間是否又很多公用元件?如果是的話,可以考慮放到一個swf中,因為這樣會降低所有元件的檔案量。
2. 你的所有元件是否都繼承同一些類,實現同一些介面,呼叫同一些類?如果是的話,可以考慮放到一個swf中,這樣比較容易管理類包,而且降低swf的檔案量,因為共有的類只編譯一次。
3. 你的所有元件是否完全獨立,沒有任何關係?如果是的話,你可以考慮每個角色獨立的swf。
具體實現程式碼如下:
應用範圍
Loader: 多用於swf,圖片(jpg,png,gif)
URLLoader: 多用於文字檔案(xml,php,jsp…)
使用方法
- //Loader:
- loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
- private function loadComplete(event:Event)
- {
- trace("done");
- addChild(loader);
- }
- //URLLoader:
- xmlLoader.dataFormat=URLLoaderDataFormat.TEXT;
- xmlLoader.addEventListener(Event.COMPLETE,xmlLoaded);
- private function xmlLoaded(event:Event) {
- try {
- myXML = XML(event.target.data);area.text=myXML;
- }catch (e:TypeError)
- {
- area.text="Load faild:\n"+e.message;
- }
- }
在使用Loader來載入資料時,新增偵聽事件時,注意一定要給Loader的 contentLoaderInfo屬性增加事件,而不是給Loader物件增加事件。
- var loader:Loader = new Loader();
- loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
- loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
- loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
SWFLoader有如下特徵:
支援flex的樣式和特效;而Loader類卻不支援任何固有的樣式和特效。
方便管理載入進度;如果使用Loader則首先要獲取LoaderInfo引用。
是一個UIComponent元件。SWFLoader它自己管理了所有子顯示物件,不需要新增多餘的程式碼。
自動縮放顯示內容的大小
可以載入Application以外的實現類,如果檢測到不是一個Application,會自動進行處理。
可以處理不同的版本。Loader不支援載入不同的編譯版本
當使用Loader載入不是受信任區域的swf時,必須提供一個遮罩來重新定位,否則它會顯示在螢幕外面:
程式碼
- import flash.display.*;
- import flash.net.URLRequest;
- var rect:Shape = new Shape();
- rect.graphics.beginFill(0xFFFFFF);
- rect.graphics.drawRect(0, 0, 100, 100);
- addChild(rect);
- var ldr:Loader = new Loader();
- ldr.mask = rect;
- var url:String = "http://www.unknown.example.com/content.swf";
- var urlReq:URLRequest = new URLRequest(url);
- ldr.load(urlReq);
- addChild(ldr);
1. 單獨的swf,每個角色獨立性很強,可以在需要的時候才載入。未來修改角色也不會影響到其它角色。但是會有很多的swf需要管理。
2. 每個角色是一個元件,存在於一個swf中,這種方法比較容易管理資源,比較乾淨。但是修改一個角色都需要重新編譯swf,可能會誤操作影響其它的元件。而且一次載入所有角色,可能會載入許多不必要的元件,浪費頻寬。
兩種方法怎麼選擇,根據專案讀者根據以下幾個問題考慮:
1. 你的所有元件相互之間是否又很多公用元件?如果是的話,可以考慮放到一個swf中,因為這樣會降低所有元件的檔案量。
2. 你的所有元件是否都繼承同一些類,實現同一些介面,呼叫同一些類?如果是的話,可以考慮放到一個swf中,這樣比較容易管理類包,而且降低swf的檔案量,因為共有的類只編譯一次。
3. 你的所有元件是否完全獨立,沒有任何關係?如果是的話,你可以考慮每個角色獨立的swf。
具體實現程式碼如下:
- <?xml version="1.0" encoding="utf-8"?>
- <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
- xmlns:s="library://ns.adobe.com/flex/spark"
- xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
- creationComplete="init()"
- >
- <fx:Declarations>
- <!-- Place non-visual elements (e.g., services, value objects) here -->
- </fx:Declarations>
- <fx:Script>
- <![CDATA[
- import mx.controls.SWFLoader;
- import mx.core.UIComponent;
- private var swfLoader:SWFLoader = new SWFLoader();
- private function init():void{
- swfLoader.addEventListener(Event.COMPLETE,swfLoadComplete);
- swfLoader.load("assets/fishmomo.swf");
- }
- private function swfLoadComplete(e:Event):void{
- /**
- * 將整個swf都載入到flex舞臺上
- * 此方法將每個flex要用的資源做成單獨的swf,需要時才載入進來
- */
- addElement(swfLoader);
- var swf:MovieClip = swfLoader.content as MovieClip;
- //fish 是 swf主舞臺上的一個魚物件,屬性命名為fish
- //呼叫舞臺上fish元件的say方法
- swf.fish.say("Load a swf");
- /**
- * 此方法可以把所有的flex要用的資源放到一個swf中
- * 把需要在flex中使用的元件連結到一個類,並將此元件拖到flash舞臺
- * 通過類名,隨意顯示其中一個元件到flex舞臺
- */
- var FishSymbol:Object = swfLoader.content.loaderInfo.applicationDomain.getDefinition("Fish");
- var f:MovieClip = new FishSymbol() as MovieClip;
- //呼叫元件的say方法
- f.say("Load a symbol within a swf");
- var ui:UIComponent = new UIComponent();
- ui.addChild(f);
- addElement(ui);
- }
- ]]>
- </fx:Script>
- </s:Application>
導致記憶體洩露的一些情況:
事件監聽:對父級物件加了監聽函式,會造成記憶體洩露,例:
override protected function mouseDownHandler(…):void {
systemManager.addEventListener(“mouseUp”, mouseUpHandler);
……
}
解決:
在銷燬物件的時候,remove掉這些監聽,雖然弱引用也可以避免這些問題,但自己掌控感覺更好。
但以下幾種情況不會造成記憶體洩露:
弱引用:someObject.addEventListener(MouseClick.CLICK, handlerFunction, false, 0, true);
對自己的引用:this.addEventListener(MouseClick.CLICK, handlerFunction);
子物件的引用:
private var childObject:UIComponent = new UIComponent;
addChild(childObject);
childObject.addEventListener(MouseEvent.CLICK, clickHandler);
總之…有addEventListener,就removeEventListener一下吧,要為自己做的事負責~哈哈
清除引用
remove掉子物件後並不會刪除該物件,他還保留在記憶體中,應該將引用設定為null
removeChildren(obj);
obj = null;
靜態成員
Class (或MXML)中有:
public static var _eventService : MyService=new MyService();
解決:在dispose時,需要設定:
_eventService =null;
module (未解決)
moduleLoader unloadModule後
ModuleInfo 並不會被GC.
Garbage Collection in a MultiCore Modular Pipes Application
這篇文章介紹了一種GC策略,感覺對於ModuleInfo 的GC無效。
(未嘗試、未遇到)
CSS樣式
module 中如果使用了shell的CSS定義或是<mx:Style> 這樣的定義,那麼這個module將不能GC.
彈出的視窗應該是同樣的結果.
解決方法,使用動態CSS檔案
module init中
StyleManager.loadStyleDeclarations(“css/myStyle.swf”);
module dispose中
StyleManager.unloadStyleDeclarations(“css/myStyle.swf”);
TextInput/Textarea(未解決)
如果module中有window使用了TextInput/Textarea控制元件,不點選沒有問題,只要點上去,那麼很遺憾了,module和所在窗體將不能被GC.
這個BUG非常嚴重,目前還沒有解決方法。
memory leak when using TextInput and TextArea when click the keyboard 這裡面附加的解決方法無效。
通過profiler分析,應該和Focusmanager有關,只有一點選就不會釋放。
CursorManager.setCursor
使用了
cursorID = CursorManager.setCursor(iconClosed);
dispose時要
CursorManager.removeCursor(cursorID);
Bitmap
如果使用Bitmap,結束時需要呼叫其dispose方法,否則記憶體消耗巨大。
另外,BitmapData是可以共享使用的,多個Bitmap可以使用同一BitmapData,節省不少記憶體。
var bmp:Bitmap =new Bitmap();
……..
if (bmp.bitmapData!=null) {
bmp.bitmapData.dispose();
}
Image
包含了Image物件時,在removeChildren時會造成不能釋放(測試多次,結果不一,建議還是做如下處理)。
解決:
img.source = null;
this.removeChild(img);
img = null;
Loader、SWFLoader、聲音、視訊、Effect等…
如果是載入SWF檔案,先停止播放。
停止聲音的播放
停止正在播放的影片剪輯(Movieclip)
關閉任何連線的網路物件,例如Loader正在載入,要先close。
取消對攝像頭或者麥克風的引用
取消事件監聽器
停止任何正在執行的定時器,clearInterval()
停止任何Timer物件,timer.stop()
停止正在播放的效果(Effect)
其他
binding也疑似有memory leak 問題。
引用以及記憶體洩露相關博文和資料:
http://blogs.adobe.com/aharui/2007/03/garbage_collection_and_memory.html
http://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/
http://www.cnblogs.com/janyou/archive/2008/11/25/1340753.html
http://www.dreamingwell.com/articles/archives/2008/05/understanding_m.php
總結:由於之前Flash一直是在網頁上使用,一般網頁都是看完就關掉的,估計Adobe在記憶體回收這塊也沒有下太大的功夫,
現在AIR的出現使得記憶體管理也相當重要了,並且,AIR本身對記憶體的消耗就相當大,一個沒有任何內容的初始建立的AIR程式,就得佔掉10-20M+的記憶體…AIR還需改善.
Modules
為什麼要模組化;模組化提供了分離應用程式程式碼到不同的swf檔案上以便減少下載時間和檔案大小。
使用Modules的好處是:
1. 主應用程式開始時不需馬上下載modules。應用程式會根據需求載入和解除安裝modules。
2. 由於每個modules獨立於其他應用程式modules,當需要改變一個modules時,你只需要重編譯這個modules而不是整個應用程式。模組化可建立模組化應用程式是提高Flex框架效能的重要方面,提供更多能力控制下載時間和檔案大小,使用modules,你可以根據哪些可被獨立載入,哪些可被其他程式使用而分離應用程式程式碼。
使用Modules的好處是:
1. 主應用程式開始時不需馬上下載modules。應用程式會根據需求載入和解除安裝modules。
2. 由於每個modules獨立於其他應用程式modules,當需要改變一個modules時,你只需要重編譯這個modules而不是整個應用程式。模組化可建立模組化應用程式是提高Flex框架效能的重要方面,提供更多能力控制下載時間和檔案大小,使用modules,你可以根據哪些可被獨立載入,哪些可被其他程式使用而分離應用程式程式碼。
優點是合理分割了主Application,模組化開發。更小的SWF檔案體積,配合RSL和延遲載入策略,大大減少使用者等待時間。
缺點就是容易引起記憶體洩露。
RSL
RSL(Runtime Shared Library),即執行時載入庫。當前L主要有3個級別的RSL,一個是Standard RSL(即一個網站內共享),一個是Cross-domain RSL(跨域共享),最後一個也是最關鍵的是Framework RSL(Flex框架共享)。
功能說明
Flex Builder在預設情況下,編譯的每個程式都是獨立的。每個程式都包含了所需類的一個副本,例如:在多個程式中都用到了VBox這個控制元件,那麼每個程式都要獨立的擁有一個VBox類。由此造成了程式程式碼的重複,使得程式碼量增大很多。而RSL正是解決此問題的一種方法,它可以把共享程式碼提取出來,然後在相同域的程式之間進行共享。這些共享程式碼不會再編譯程式序,而是放在單獨的庫中,供執行時載入。另外,RSL也可以在客戶端進行快取,因此不需要在每次使用程式時重複下載。
功能說明
Flex Builder在預設情況下,編譯的每個程式都是獨立的。每個程式都包含了所需類的一個副本,例如:在多個程式中都用到了VBox這個控制元件,那麼每個程式都要獨立的擁有一個VBox類。由此造成了程式程式碼的重複,使得程式碼量增大很多。而RSL正是解決此問題的一種方法,它可以把共享程式碼提取出來,然後在相同域的程式之間進行共享。這些共享程式碼不會再編譯程式序,而是放在單獨的庫中,供執行時載入。另外,RSL也可以在客戶端進行快取,因此不需要在每次使用程式時重複下載。
RSL(Runtime shared libraries)即動態連結庫,在程式執行時由FlashPlayer動態載入。靜態連結庫是SWC檔案,通過編譯器的library-path和include-libraries
編譯進應用程式。採用靜態連結的應用程式SWF會產生比較大的檔案以及更長的下載時間。使用RSL的應用程式載入時間短且檔案比較小,而且提高了記憶體使用效率,只是
在開始需要花點時間下載RSL。RSL的強大體現在多個應用程式共享公共程式碼時,因為RSL只需要被下載一次,多個應用程式動態連結到相同的RSL,訪問其中已經快取在客
戶端的資源。
使用RSL:
(1).在專案資料夾中點右建,選擇"properties"-"Flex Build Path"-"Library Path"
(2).該選項卡上我們看到"FrameWork linkage",預設是"Merged into cdoe"(FLEX4預設是RSL)
(3).點開下拉,選擇"runtime shared library(RSL)"
(4).針對自定義的SWC,修改其link type為RSL,選擇None,同時勾上Automatically extract swf to deployment path(自動將SWF提取到部署路徑)。如果想對不同域的RSL共享,則選擇Digests(摘要),同時指定其Policy file url(策略檔案)。具體可參考FLEX SDK中的SWC檔案處理方式。
(5).點選OK
編譯進應用程式。採用靜態連結的應用程式SWF會產生比較大的檔案以及更長的下載時間。使用RSL的應用程式載入時間短且檔案比較小,而且提高了記憶體使用效率,只是
在開始需要花點時間下載RSL。RSL的強大體現在多個應用程式共享公共程式碼時,因為RSL只需要被下載一次,多個應用程式動態連結到相同的RSL,訪問其中已經快取在客
戶端的資源。
使用RSL:
(1).在專案資料夾中點右建,選擇"properties"-"Flex Build Path"-"Library Path"
(2).該選項卡上我們看到"FrameWork linkage",預設是"Merged into cdoe"(FLEX4預設是RSL)
(3).點開下拉,選擇"runtime shared library(RSL)"
(4).針對自定義的SWC,修改其link type為RSL,選擇None,同時勾上Automatically extract swf to deployment path(自動將SWF提取到部署路徑)。如果想對不同域的RSL共享,則選擇Digests(摘要),同時指定其Policy file url(策略檔案)。具體可參考FLEX SDK中的SWC檔案處理方式。
(5).點選OK
SWC 檔案是類似 zip 的檔案。靜態連結庫是SWC檔案,通過編譯器的library-path和include-libraries編譯進應用程式。新建Flex Library Object或使用compc命令可以製作SWC。
E4X
E4X是在ECMA-357標準中定義的,併成為AS3的一部分。優點是提供更簡明和可讀性強的語法從XML中查詢和提取資料。
profile工具
可以很方便地觀察物件的建立和銷燬,幫助檢查記憶體洩露問題。
FlexUnit
FlexUnit - Flex單元測試框架
其他
1、flex生成出來的檔案都是很大,請問你用什麼辦法進行縮小呢?
(1)RSL
(2)Module
(3)外部載入資源
2、做一個flex專案,你認為成功的要素在哪呢?
(1)資料和需求等傳統軟體專案的成功要素
(2)模組化開發,MVC框架
(3)swf檔案減肥,執行效率,記憶體洩露問題,前臺優化
(4)開源元件的使用
3、flex 前端的效能優化
(1)、避免容器的多級巢狀,減少相對尺寸、相對定位的使用。
(2)、儘量使用輕量級的容器
(3)、避免使用大體積的元件,比如DataGrid、AdvancedDataGrid
(4)、處理資料時多用分頁的方式
(5)、少使用setStyle
(6)、使用延遲例項化載入子元件
4.Embed繫結圖片有什麼缺點?
答:直接編譯到swf檔案中,造成其體積過大。而且由於嵌入程式碼中,維護不便。
5、flex裡呼叫JS措施?
答:直接在AS中利用ExternalInterface.call()來呼叫JS措施。如:
6、用JavaScript呼叫ActionScript函式
答:利用ExternalInterface.addCallback在JavaScript裡設定對Flex的回撥措施並且在JavaScript裡呼叫ActionScript措施。
6、FileReference
答:
(1)RSL
(2)Module
(3)外部載入資源
2、做一個flex專案,你認為成功的要素在哪呢?
(1)資料和需求等傳統軟體專案的成功要素
(2)模組化開發,MVC框架
(3)swf檔案減肥,執行效率,記憶體洩露問題,前臺優化
(4)開源元件的使用
3、flex 前端的效能優化
(1)、避免容器的多級巢狀,減少相對尺寸、相對定位的使用。
(2)、儘量使用輕量級的容器
(3)、避免使用大體積的元件,比如DataGrid、AdvancedDataGrid
(4)、處理資料時多用分頁的方式
(5)、少使用setStyle
(6)、使用延遲例項化載入子元件
4.Embed繫結圖片有什麼缺點?
答:直接編譯到swf檔案中,造成其體積過大。而且由於嵌入程式碼中,維護不便。
5、flex裡呼叫JS措施?
答:直接在AS中利用ExternalInterface.call()來呼叫JS措施。如:
- import flash.external.ExternalInterface ;
- ExternalInterface.call("JSFunction");
- ExternalInterface.call("JSFunctionWithParameters","myParameter");
- var result:String=ExternalInterface.call("JSFunctionWithReturn");
6、用JavaScript呼叫ActionScript函式
答:利用ExternalInterface.addCallback在JavaScript裡設定對Flex的回撥措施並且在JavaScript裡呼叫ActionScript措施。
- AS:
- ExternalInterface.addCallback("function1",callback1);
- privatefunctioncallback1():void
- {
- Alert.show("callback1executed");
- }
- JS:
- container[swf].function1();
6、FileReference
答:
- browse(typeFilter:Array = null):Boolean//揭示一個檔案博覽對話方塊,讓使用者抉擇要上載的檔案。
- cancel():void//廢止正在對該 FileReference 物件厲行的任何上載或下載壟斷。
- download(request:URLRequest, defaultFileName:String = null):void//敞開對話方塊,以批准使用者從長途伺服器下載檔案.
- upload(request:URLRequest, uploadDataFieldName:String = "Filedata", testUpload:Boolean = false):void//開始將使用者抉擇的檔案上載到長途伺服器。
7、flash與flex是如何調停開發的?
答:這個問題能夠這麼來會意,萬一是確乎必需用到FLEX SDK的利用,那我們就能夠發生一個flex工程,翔實必需flash做UI的時候,輸出成swc作為flex的skin,萬一說並無須要flex sdk,只是為了編碼得體而抉擇flex的話,那我們凡是發生一個as工程,讓flex作為flash的編碼器。
8、請說下事件裡的currentTarget 和 target的區別?
答:在事件流的過程中,目標階段確定的目標物件由Event中的target屬性來記錄,
冒泡階段移動的遊標則由currentTarget來記錄。事件物件冒泡過程中每往上移動一級,就會克隆出一個僅與前副本currentTarget不同的新副本。
9、warning: unable to bind to property ” on class ‘Object’ (class is not an IEventDispatcher) 在使用ItemRender時,經常會出現這種警告?
答:ArrayCollection的子元素是無法作為資料來源繫結的。可以宣告中間變數,在override set data時將ArrayCollection的子元素傳入,
然後再將中間變數作為新的繫結源即可。
10、常用的幾個切換資料的元件比如: TabNavigator等都有屬性 creationPolicy 你知道這種策略的使用方式是什麼嘛?以及優,缺點呢?
答:延遲例項化。優點是可以更快地載入元件,缺點是首次訪問其他元件時,由於需要重新載入此元件,可能會有一定的延遲。
11、請試寫一個自定義的驗證元件
答:
- package myCompenent
- {
- import mx.validators.Validator;//引用Validator類
- import mx.validators.ValidationResult;//引用ValidationResult類
- public class myValidators extends Validator
- {
- public function myValidators()//建構函式
- {
- super();
- }
- private var results:Array;//定義一個陣列,用以儲存錯誤
- //重寫驗證函式
- override protected function doValidation(value:Object):Array
- {
- var s:String = value as String;
- results = [];//清空陣列
- results = super.doValidation(value);//先用繼承類中的doValida tion方法驗證
- if (results.length > 0)//如果驗證時有錯,返回錯誤資訊
- return results;
- if(s.length>6)//自定義驗證,字元長度不超過6
- {
- //記錄出錯資訊
- results.push(new ValidationResult(true,”text”,”StringTooLong”, “字元長度超過6了”));
- }
- return results;
- }
- }