2009-03-06 2 views
1

Data binding in ActionScript действительно круто. Но что, если я хочу, чтобы реорганизовать большой переключатель или если заявление внутри фигурных скобок в функцию, например:как код рефакторинга внутри фигурных скобок в flex

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

в:

 
{salutation(person)} 

компилятор не позволяет мне сделать это. Я знаю о свойствах, и я мог писать геттеры и сеттеры на объекте человека. Но поскольку я использую встроенные объекты JSON, сейчас это не удобно (я думаю). Какие еще хорошие способы реорганизовать этот код?

Чтобы ответить на комментарий Мэтта. Тип данных человека - просто объект Object. Он был декодирован из формата JSON, исходящего из служебного вызова.

+0

Что такое тип данных " человек"? –

ответ

4

Вам нужно будет сделать класс Person (при условии, что он у вас есть), чтобы он работал.

Однако, поскольку вы говорите, что используете объекты JSON, я предполагаю, что у вас есть анонимные объекты, которые были проанализированы из строки JSON. В этом случае я уверен, что это не сработает. Вам нужно будет создать строго типизированный объект, который имеет свойства bindable.

Просто FYI: чтобы избежать необходимости писать пользовательские JSON парсеры для каждого объекта, который необходимо создать, вы можете создавать сильные типизированных объектов из объектов ваниль с помощью ByteArray, трюк:

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

Вау! Я не видел такого рода неприятный взлом со времен Delphi RTTI. Cool ... –

+0

Больной, больной, взломать Кристофа! Мне это нравится. Я просто могу использовать его. – airportyh