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:错误 #1056:无法在 data.SaveDataHandler 上创建属性 InGameSettings.sfSaveData.data.locationArray。

所以,如果你能指出我正确的方向,我将不胜感激。因为这个原因,我这周掉了很多头发,但我真的很想让这个工作来整理我的代码中的一个讨厌的 hack,所有这些都被硬编码到 SaveDataHandler 类中。

4

1 回答 1

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
于 2013-04-18T16:40:40.207 回答