使用對象數組處理 ActionScript 中的記錄集
如果您停下來想想這個問題,您可以使用結構變數的數組來包含資料,類似於 ColdFusion 查詢(記錄集)變數。如果我在以下表單中有資料:
| 行號 |
名稱 |
名稱 |
管理狀態 |
| 1 |
Fred |
123 |
FALSE |
| 2 |
Ginger |
234 |
TRUE |
使用 cfquery 標籤,我可以從這樣一個表中檢索資料:
<cfquery name="qUsers" datasource="thisData">
SELECTname, id, adminStatus
FROMUser
</cfquery>
然後使用以下內容引用 Ginger 的管理狀態:
qUsers.adminStatus[2]
[queryName].[columnName][rowNumber]
不幸的是,只有 ColdFusion 應用程式伺服器瞭解 ColdFusion 查詢對象。提供相同資料結構的另一種方法是作為結構變數的數組。使用類似以下內容的代碼,我可以將我的查詢變數轉換為結構變數的數組:
<cfset aUsers = arrayNew(1)>
<cfloop from="1" to="#qUsers.recordCount#" index="i">
<cfset aUsers[i] = structNew()>
<cfloop list="#qUsers.columnList#" index="columnName">
<cfset aUsers[i][columnName] = qUsers[columnName][i]>
</cfloop>
</cfloop>
請參見 demo_query2structarray.cfm。
然後我可以引用 Ginger 的管理狀態:
aUsers[2].adminStatus
[arrayName][index].[struct key name]
作為結構數組格式化的記錄集在各個方面都非常有用。例如,它們可以通過 SOAP 作為 Web 服務請求或響應傳遞,而 ColdFusion 查詢對象則不能。
ActionScript 處理資料的“資料集”時使用非常相似的資料結構:物件變數的數組(“對象數組”)。例如,上面顯示的資料表可能在 ActionScript 中表示,如下所示:
var users = [ ];
var user1 = {name:'Fred', id:123, adminStatus:false};
users.push(user1);
var user2 = {name:'Ginger', id:234, adminStatus:true};
users.push(user2);
使用對象數組作為資料提供者
cfselect 和 cfgrid 標籤使用的 Flash 組件支援名為 dataProvider 的屬性。填充 cfselect 標籤的一個方法是通過建立字串值的數組並將其設定為您控制項的資料提供者。您使用每個字串作為標籤或一行控制項的可見內容。例如:
<cfsavecontent variable="loadData">
var users = ["Jan", "Joe", "Bob"];
userSelect.dataProvider = users;
</cfsavecontent>
<cfform format="flash" width="300" height="500">
<cfinput name="loadData" type="button" value="Load Data"
onclick="#loadData#">
<cfselect name="userSelect">
<option>default</option>
</cfselect>
</cfform>
請參見 demo_cfselectdataprovider1.cfm 獲得完整程式碼範例。
本樣本中,初始標籤“default”被替換為新的一組標籤。您還可以使用 .addItem() 方法向選擇控制項添加新的項目,而不是替換它們。例如:
<cfsavecontent variable="loadData">
var users = ["Jan", "Joe", "Bob"];
for(var i=0; i < users.length; i++)
{
userSelect.addItem(users[i]);
}
</cfsavecontent>
<cfform format="flash" width="300" height="500">
<cfinput name="loadData" type="button" value="Add Data"
onclick="#loadData#">
<cfselect name="userSelect">
<option>default</option>
</cfselect>
</cfform>
請參見 demo_cfselectdataprovider2.cfm 獲得完整程式碼範例。
當然,您還可以向控制項添加使用者提供的資料,如下所示:
<cfsavecontent variable="addData">
var newLabel = newData.text;
userSelect.addItem(newLabel);
</cfsavecontent>
<cfform format="flash" width="300" height="500">
<cfinput name="loadData" type="button" value="Add Data"
onclick="#addData#">
<cfinput name="newData" type="text" />
<cfselect name="userSelect">
<option>default</option>
</cfselect>
</cfform>
請參見 demo_cfselectdataprovider3.cfm 獲得詳細資料。
或者,您可以在控制項中為每個項目指定一個不同於可見標籤的資料值,就像您指定一個選項值一樣,該值不同於通過標籤指定預設資料時的可見選項文本。為此,您可以向 dataProvider 指定一個對象數組,它包含具有兩個屬性的對象:標籤和資料。例如:
<cfsavecontent variable="loadData">
var users = [];
var user1 = {label:'Fred', data:123};
users.push(user1);
var user2 = {label:'Ginger', data:456};
users.push(user2);
userSelect.dataProvider = users;
</cfsavecontent>
<cfform format="flash" width="300" height="500">
<cfinput name="loadData" type="button" value="Load Data"
onclick="#loadData#">
<cfformitem type="text" bind="{userSelect.selectedItem.data}" />
<cfselect name="userSelect">
<option value="default value">default</option>
</cfselect>
</cfform>
請參見 demo_cfselectdataprovider4.cfm。
在選擇控制項中,.selectedItem 屬性是對當前選擇行對象(“項目”)的引用,如控制項的 dataProvider 屬性所指定。如果標籤和資料值都已指定,則它將引用具有這兩個屬性的對象。
在上面的樣本中,通過使用綁定在 cfformitem 標籤中使用資料值。綁定的工作方式類似於 onchange 事件控制代碼。在綁定屬性中,將對屬性的引用放置在花括弧中。一旦綁定屬性的值更改時,更改的值將複製到 cfformitem 標籤中。因此,當在 userSelect 選擇的項目更改時,將顯示新項目的資料。當然,如果相關,您可以綁定到標籤屬性。