說明白一點就是Array不具有data binding的功能,而ArrayCollection有,但我大多都是用Array來作為UI物件的dataprovider,結果也是可以binding的!?當然或許我有重新賦值所以其實不算binding
經過觀察API結構後發現,Array並沒有addEventListener的功能
而ArrayCollection因為繼承了ListCollectionView,所以有了addEventListener的功能
這代表當我們替ArrayCollection加上[Bindable]標籤時,
編譯器自動幫我們做了監聽CollectionEvent.COLLECTION_CHANGE事件的動作
但Array就沒辦法監聽事件
不過有趣的是,ListCollectionView並不是因為實做IEventDispacher介面而有addEventListener功能,而是他自己定義了個同名的function…
API裡面的addEventListener並沒有繼承的小箭頭
廢話了一大堆,總言之,作為UI物件的dataprovider,我們盡量用ArrayCollection 就是了
下面是一個小實驗
這是使用Array作為dataprovider,各位可以在click那邊設定中斷點觀察,其實值是有加進去的,但是就算在宣告時打了Bindable,結果UI物件還是沒有更新
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
[Bindable]
private var myArray:Array = new Array();
]]>
</mx:Script>
<mx:TextInput id="input" text="Item"/>
<mx:Button click="myArray.push({label:input.text})" label="Add"/>
<mx:List dataProvider="{myArray}"/>
</mx:Application>
這邊改為ArrayCollection就可以了
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
[Bindable]
private var myArray:ArrayCollection= new ArrayCollection();
]]>
</mx:Script>
<mx:TextInput id="input" text="Item"/>
<mx:Button click="myArray.addItem({label:input.text})" label="Add"/>
<mx:List dataProvider="{myArray}"/>
</mx:Application>
