2013-04-18 47 views
0

過去幾天我一直在思考這個問題,同時我可以找到其他人有過這樣的問題,這些問題是圍繞使用動態變量名字,這些解決方案都不適合我所要做的。使用變量的內容作爲標識符將數據分配給共享對象

我一直在使用一個共享對象(用於這個提供的名稱sfSaveData)來創建一個本地保存文件。這個系統在多個項目中使用得相當開心,但代碼不是太便攜。也就是說,對於每個項目,我必須完全更改類文件以合併每個要存儲的設置/數據。所以我有這個腦波 - 而不是手動更改創建/更新本地保存文件的類,我將把必要的更改放在XML文件中,並且有一個類循環遍歷XML並在共享對象內創建必要的數據。

我已經意識到事情的XML方面,我的問題是得到的結果正確引用共享對象。以下是我的工作正常:

爲了完整起見,這是XML文件的一個摘錄,目前正在執行此操作我只使用該文件中的這一個條目(沒有意義添加更多數據直到它的工作)

<dataField label = "dataField"> 
    <dataTitle label = "dataTitle">locationArray</dataTitle> 
    <dataType label = "dataType">Array</dataLabel> 
    <dataContent label = "dataContent">[true, true, true, true, true]</dataContent> 
</dataField> 

注意:DataPass是一個自定義事件,它允許與事件傳遞數據。在這個例子中,它傳遞一個包含XML內容的變量。數據可通過變量event.datPass訪問。這是正確傳輸。

這是在一個類文件(SaveDataHandler)中,包含共享對象的文件是InGameSettings。 SaveDataHandler被創建爲一個實例。 InGameSettings是一個填充了公共靜態變量的公共類(包括sfSaveData:SharedObject)。對於它的價值,文件夾結構是/ data/SaveDataHandler和/ setting/InGameSettings。現在

function processSaveXML(event:DataPass):void { 
    var outputString; 
    for each (var dataField.XML in event.datPass) { 
     outputString = (InGameSettings.sfSaveData.data." + dataField.dataTitle); 
     /* 
     * This is where it all goes wrong ;) 
     * To access outputString's content as the variable name, I use "this". 
     * I realise that this causes outputString to relate to the SaveDataHandler 
     * class rather than the InGameSettings class - which is part of the problem 
     */ 
     this[outputString] = dataField.dataContent; 
     InGameSettings.sfSaveData.flush(); 
    } // for each loop 
} // function processSaveXML 

如果我手動鍵入變量名中的一個 - 例如

InGameSettings.sfSaveData.LocationArray = dataField.dataContent 

代替

this[outputString] = dataField.dataContent 

它工作正常。我的問題是,我不知道如何獲取outputString的內容作爲不同類的變量的標識符。我得到的是錯誤信息:

ReferenceError: Error #1056: Cannot create property InGameSettings.sfSaveData.data.locationArray on data.SaveDataHandler.

所以,如果你能指出我正確的方向,我會非常感激。由於這個原因,本週我已經失去了很多頭髮,但是我真的希望得到這個工作,以便在我的代碼中完成一個令人討厭的黑客攻擊,所有這些都被硬編碼到SaveDataHandler類中。

回答

0
function processSaveXML(event:DataPass):void { 
var outputString; 
for each (var dataField.XML in event.datPass) { 
    outputString = dataField.dataTitle; 

    InGameSettings.sfSaveData.data[outputString] = dataField.dataContent; 
    // the trick is here. You need to refer "data" of the SO, and then add 
    // what's in brackets to make a dynamic property. 
    InGameSettings.sfSaveData.flush(); 
} // for each loop 
} // function processSaveXML 
+0

感謝您的Vesper - 我有這種感覺,這將是那些簡單的事情,我一直在尋找了錯誤的方式圍繞一個。感謝你的回答,我今晚可以睡得很好。 –

相關問題