2009-03-06 43 views
1

Data binding in ActionScript numaralı kuşaktaki parantez içindeki refactor kodu nasıl düzeltileceği gerçekten harika. Ama isterseniz neyi örneğin bir fonksiyonun içine küme parantezi içindeki büyük anahtarı veya deyimi ise refactor:kodunun

 
{person.gender == 'male' ? 'Mr.' : 'Ms.'} 

içine:

 
{salutation(person)} 

derleyici yapmama izin vermez. Özellikleri biliyorum ve kişi nesnesinde alıcılar ve setçiler yazabilirim. Ancak satır içi JSON nesneleri kullanıyorum beri bu uygun değil (Bence). Bu kodu yeniden düzenlemenin diğer iyi yolları nelerdir?

Matt'in yorumunu yanıtlamak için. Kişinin veri türü sadece düz Nesne. Servis çağrısından gelen JSON biçiminden çözüldü.

+0

veri türü "için nedir: Her sen bir ByteArray hile kullanarak vanilya nesnelerden güçlü Yazılan nesneleri oluşturabilir oluşturmak istediğiniz nesne için özel JSON ayrıştırıcıları yazmak zorunda kalmamak için kişi"? –

cevap

4

Bunun işe yaraması için Kişi sınıfını (bir tane varsayarak) ikiye katlanabilir hale getirmeniz gerekir.

Ancak, JSON nesnelerini kullandığınızı söylediğinizde, bir JSON dizesinden ayrıştırılan anonim nesnelerin olduğunu varsayıyorum. Bu durumda, işe yaramadığından eminim. Çiftlenebilir özelliklere sahip, güçlü yazılan bir nesne oluşturmanız gerekir. Bilginize

:

public static function toInstance(object:Object, clazz:Class):* { 
    var bytes:ByteArray = new ByteArray(); 
    bytes.objectEncoding = ObjectEncoding.AMF0; 

    // Find the objects and byetArray.writeObject them, adding in the 
    // class configuration variable name -- essentially, we're constructing 
    // and AMF packet here that contains the class information so that 
    // we can simplly byteArray.readObject the sucker for the translation 

    // Write out the bytes of the original object 
    var objBytes:ByteArray = new ByteArray(); 
    objBytes.objectEncoding = ObjectEncoding.AMF0; 
    objBytes.writeObject(object); 

    // Register all of the classes so they can be decoded via AMF 
    var typeInfo:XML = describeType(clazz); 
    var fullyQualifiedName:String = [email protected]().replace(/::/, "."); 
    registerClassAlias(fullyQualifiedName, clazz); 

    // Write the new object information starting with the class information 
    var len:int = fullyQualifiedName.length; 
    bytes.writeByte(0x10); // 0x10 is AMF0 for "typed object (class instance)" 
    bytes.writeUTF(fullyQualifiedName); 
    // After the class name is set up, write the rest of the object 
    bytes.writeBytes(objBytes, 1); 

    // Read in the object with the class property added and return that 
    bytes.position = 0; 

    // This generates some ReferenceErrors of the object being passed in 
    // has properties that aren't in the class instance, and generates TypeErrors 
    // when property values cannot be converted to correct values (such as false 
    // being the value, when it needs to be a Date instead). However, these 
    // errors are not thrown at runtime (and only appear in trace ouput when 
    // debugging), so a try/catch block isn't necessary. I'm not sure if this 
    // classifies as a bug or not... but I wanted to explain why if you debug 
    // you might seem some TypeError or ReferenceError items appear. 
    var result:* = bytes.readObject(); 
    return result; 
} 
+0

Vay! Delphi RTTI günlerimden beri bu tür kötü bir hack görmedim. Cool ... –

+0

Hasta, hasta, Christophe hack! Bunu sevdim. Sadece kullanabilirim. – airportyh