2013-04-18 1 views
0

J'ai réfléchi à ce problème ces derniers jours, et même si je peux trouver d'autres personnes qui ont eu des problèmes qui tournent autour de l'utilisation de la variable dynamique noms, aucune des solutions fonctionne tout à fait pour ce que je suis en train de faire.Affectation de données à un objet partagé en utilisant le contenu d'une variable comme identifiant

J'ai utilisé un objet partagé (pour ce nom voulu sfSaveData) pour créer un fichier de sauvegarde local. Ce même système a été utilisé assez heureusement dans plusieurs projets, mais le code n'est pas trop portable. C'est-à-dire que pour chaque projet, je dois complètement changer le fichier de classe pour incorporer chacun des paramètres/données à stocker. J'ai donc ce brainwave - plutôt que de changer manuellement la classe qui crée/met à jour le fichier save local, je vais mettre les changements nécessaires dans un fichier XML, et avoir une classe qui boucle le XML et crée les données nécessaires dans l'objet partagé .

J'ai examiné le côté XML des choses, mon problème est d'obtenir les résultats pour référencer correctement l'objet partagé. Voici ce que j'ai qui fonctionne correctement:

Pour être complet, ceci est un extrait du fichier XML, au moment de faire fonctionner cela, je ne travaille qu'avec cette seule entrée dans le fichier (pas besoin d'ajouter plus les données jusqu'à ce qu'il fonctionne)

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

NOTES: DataPass est un événement personnalisé qui permet la transmission des données à l'événement. Dans ce cas, il transmet une variable contenant le contenu XML. Les données sont accessibles via la variable event.datPass. Ceci est en train de transférer correctement.

Ceci est dans un fichier de classe (SaveDataHandler) et le fichier qui contient l'objet partagé est InGameSettings. SaveDataHandler est créé en tant qu'instance. InGameSettings est une classe publique remplie de Vars statique publique (y compris sfSaveData: SharedObject). Et pour ce que ça vaut, la structure du dossier est/data/SaveDataHandler et/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 

Maintenant, si je tape manuellement dans l'un des noms de variables - par exemple

InGameSettings.sfSaveData.LocationArray = dataField.dataContent 

au lieu de

this[outputString] = dataField.dataContent 

Il fonctionne très bien. Mon problème est que je ne sais pas comment obtenir le contenu de outputString à utiliser comme identifiant pour la variable sur une classe différente. Ce que je reçois est le message d'erreur:

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

Donc, si vous pouvez me diriger dans la bonne direction, je serais très reconnaissant. J'ai perdu beaucoup de cheveux cette semaine à cause de cela, mais je veux vraiment que cela fonctionne pour éliminer un hack méchant dans mon code où tout ceci est codé dur dans la classe SaveDataHandler.

Répondre

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

Merci Vesper - J'avais l'impression que ça allait être une de ces choses simples où je regardais les choses à l'envers. Grâce à votre réponse, je serai capable de dormir profondément ce soir. –

Questions connexes