Du kan lägga till en *.sol-fil för
SharedObject
med hjälp av egenskapen
data
för SharedObject-objektet. Använd följande syntax när du lägger till nya data i det delade objektet:
sharedObject_name.data.variable = value;
Exemplet nedan lägger till egenskaperna
userName
,
itemNumbers
och
adminPrivileges
samt deras värden i ett SharedObject:
public var currentUserName:String = "Reiner";
public var itemsArray:Array = new Array(101,346,483);
public var currentUserIsAdmin:Boolean = true;
mySO.data.userName = currentUserName;
mySO.data.itemNumbers = itemsArray;
mySO.data.adminPrivileges = currentUserIsAdmin;
När du har tilldelat värden till egenskapen
data
, måste du instruera Flash Player att skriva värdena till SharedObject-filen. Om du vill tvinga Flash Player att skriva värdena till SharedObject-filen kan du använda metoden
SharedObject
.
flush()
, på följande sätt:
mySO.flush();
Om du inte anropar
SharedObject.flush()
skriver Flash Player värdena till filen när programmet stängs. Det ger dock inte användaren möjlighet att öka utrymmet som Flash Player har tillgängligt för datalagring om datastorleken överstiger standardinställningarna. Därför är det bra rutin att anropa
SharedObject.flush()
.
När du använder metoden
flush()
för att skriva delade objekt till en användares hårddisk bör du vara noga med att kontrollera om användaren uttryckligen har inaktiverat lokal lagring med hjälp av inställningshanteraren i Flash Player (
www.macromedia.com/support/documentation/se/flashplayer/help/settings_manager07.html
), som framgår i följande exempel:
var so:SharedObject = SharedObject.getLocal("test");
trace("Current SharedObject size is " + so.size + " bytes.");
so.flush();
Lagra objekt i delade objekt
Du kan lagra enkla objekt som arrayer eller strängar i egenskapen
data
för ett SharedObject.
Exemplet nedan är en ActionScript-klass som definierar metoder som styr interaktionen med det delade objektet. Med dessa metoder kan användare lägga till och ta bort objekt från det delade objektet. Klassen lagrar en ArrayCollection som innehåller enkla objekt.
package {
import mx.collections.ArrayCollection;
import flash.net.SharedObject;
public class LSOHandler {
private var mySO:SharedObject;
private var ac:ArrayCollection;
private var lsoType:String;
// The parameter is "feeds" or "sites".
public function LSOHandler(s:String) {
init(s);
}
private function init(s:String):void {
ac = new ArrayCollection();
lsoType = s;
mySO = SharedObject.getLocal(lsoType);
if (getObjects()) {
ac = getObjects();
}
}
public function getObjects():ArrayCollection {
return mySO.data[lsoType];
}
public function addObject(o:Object):void {
ac.addItem(o);
updateSharedObjects();
}
private function updateSharedObjects():void {
mySO.data[lsoType] = ac;
mySO.flush();
}
}
}
Följande Flex-program skapar en instans av ActionScript-klassen för alla typer av delade objekt som det behöver. Det anropar sedan metoder för den klassen när användaren lägger till eller tar bort URL för bloggar eller webbplatser.
<?xml version="1.0"?>
<!-- lsos/BlogAggregator.mxml -->
<mx:Application
xmlns:local="*"
xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="initApp()"
backgroundColor="#ffffff"
>
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.utils.ObjectUtil;
import flash.net.SharedObject;
[Bindable]
public var welcomeMessage:String;
[Bindable]
public var localFeeds:ArrayCollection = new ArrayCollection();
[Bindable]
public var localSites:ArrayCollection = new ArrayCollection();
public var lsofeeds:LSOHandler;
public var lsosites:LSOHandler;
private function initApp():void {
lsofeeds = new LSOHandler("feeds");
lsosites = new LSOHandler("sites");
if (lsofeeds.getObjects()) {
localFeeds = lsofeeds.getObjects();
}
if (lsosites.getObjects()) {
localSites = lsosites.getObjects();
}
}
// Adds a new feed to the feeds DataGrid.
private function addFeed():void {
// Construct an object you want to store in the
// LSO. This object can contain any number of fields.
var o:Object = {name:ti1.text, url:ti2.text, date:new Date()};
lsofeeds.addObject(o);
// Because the DataGrid's dataProvider property is
// bound to the ArrayCollection, Flex updates the
// DataGrid when you call this method.
localFeeds = lsofeeds.getObjects();
// Clear the text fields.
ti1.text = '';
ti2.text = '';
}
// Removes feeds from the feeds DataGrid.
private function removeFeed():void {
// Use a method of ArrayCollection to remove a feed.
// Because the DataGrid's dataProvider property is
// bound to the ArrayCollection, Flex updates the
// DataGrid when you call this method. You do not need
// to update it manually.
if (myFeedsGrid.selectedIndex > -1) {
localFeeds.removeItemAt(myFeedsGrid.selectedIndex);
}
}
private function addSite():void {
var o:Object = {name:ti3.text, date:new Date()};
lsosites.addObject(o);
localSites = lsosites.getObjects();
ti3.text = '';
}
private function removeSite():void {
if (mySitesGrid.selectedIndex > -1) {
localSites.removeItemAt(mySitesGrid.selectedIndex);
}
}
]]>
</mx:Script>
<mx:Label text="Blog aggregator" fontSize="28"/>
<mx:Panel title="Blogs">
<mx:Form id="blogForm">
<mx:HBox>
<mx:FormItem label="Name:">
<mx:TextInput id="ti1" width="100"/>
</mx:FormItem>
<mx:FormItem label="Location:">
<mx:TextInput id="ti2" width="300"/>
</mx:FormItem>
<mx:Button id="b1" label="Add Feed" click="addFeed()"/>
</mx:HBox>
<mx:FormItem label="Existing Feeds:">
<mx:DataGrid
id="myFeedsGrid"
dataProvider="{localFeeds}"
width="400"
/>
</mx:FormItem>
<mx:Button id="b2" label="Remove Feed" click="removeFeed()"/>
</mx:Form>
</mx:Panel>
<mx:Panel title="Sites">
<mx:Form id="siteForm">
<mx:HBox>
<mx:FormItem label="Site:">
<mx:TextInput id="ti3" width="400"/>
</mx:FormItem>
<mx:Button id="b3" label="Add Site" click="addSite()"/>
</mx:HBox>
<mx:FormItem label="Existing Sites:">
<mx:DataGrid
id="mySitesGrid"
dataProvider="{localSites}"
width="400"
/>
</mx:FormItem>
<mx:Button id="b4" label="Remove Site" click="removeSite()"/>
</mx:Form>
</mx:Panel>
</mx:Application>
Lagra skrivna objekt i delade objekt
Du kan lagra skrivna ActionScript-instanser i delade objekt. Du kan göra det genom att anropa metoden
flash.net.registerClassAlias()
för att registrera klassen. Om du skapar en instans av klassen och lagrar den i datamedlemmen för det delade objektet och sedan läser ut objektet, får du en skriven instans. Som standard har SharedObject-egenskapen
objectEncoding
stöd för AMF3-kodning och packar upp den lagrade instansen från SharedObject-objektet. Den lagrade instansen behåller den typ som du specificerade när du anropade metoden
registerClassAlias()
.