как изменить код внутри фигурных скобок в flex - PullRequest
1 голос
/ 06 марта 2009

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

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

в

{salutation(person)}

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

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

1 Ответ

4 голосов
/ 06 марта 2009

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

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

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

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 = typeInfo.@name.toString().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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...