2012-06-21 2 views
0

Я не могу получить доступ к значениям в объекте Flex (ArrayCollection) после получения его из Zend AMF. Оригинальный тип послали PHP ассоциативный массив, который просто возвращается какДоступ к значениям в результате создания объекта Flex из Zend AMF возникло как ассоциативный массив PHP

return $this->sections['initial_setup']; 

PHP Переменные:

sections array in variable view

требуемый результат послал выглядит в закладки Чарльз АИФ RPC:

Charles proxy AMF RPC view

Но когда я получаю данные в Flex как Object (или String [] - это не имеет значения), я не может получить доступ к значениям свойств в таком коде

var result:Object = event.result; 
    if (result['database'] == 'yes' && result['admin'] == 'yes') 
     // continue branch ... 

и я получаю исключение на if-линии:

Error: Unknown Property: 'database'. 
     at mx.collections::ListCollectionView ... 

Наконец, я могу видеть в переменных Eclipse, посмотреть, что экземпляр ResultEvent несет результат типа ArrayCollection с 0 длиной и значение, полученное видны со значком D (я не мог найти то, что D означает украшение):

ResultEvent variable

Но почему я до сих пор не могу получить к ним доступ вообще и что мне делать, чтобы использовать их?

Я попытался изменить типы Array или ArrayCollection вместо Object. Также есть thread, обсуждающий подобную проблему, но после попытки этого это тоже не помогает.

Любая помощь будет высоко ценится: о)

EDIT 1: Вот код FB генерируется супер конструктор класса для ConfigurationService:

// Constructor 
public function _Super_ConfigurationService() 
{ 
    // initialize service control 
    _serviceControl = new mx.rpc.remoting.RemoteObject(); 

    // initialize RemoteClass alias for all entities returned by functions of this service 

    var operations:Object = new Object(); 
    var operation:mx.rpc.remoting.Operation; 

    operation = new mx.rpc.remoting.Operation(null, "readSettings"); 
    operation.resultType = Object; 
    operations["readSettings"] = operation; 
    operation = new mx.rpc.remoting.Operation(null, "writeSettings"); 
    operations["writeSettings"] = operation; 
    operation = new mx.rpc.remoting.Operation(null, "readDBSettings"); 
    operation.resultType = valueObjects.ConnectionParams; 
    operations["readDBSettings"] = operation; 
    operation = new mx.rpc.remoting.Operation(null, "writeDBSettings"); 
    operations["writeDBSettings"] = operation; 
    operation = new mx.rpc.remoting.Operation(null, "readInitSetupCompletion"); 
    operation.resultType = Object; 
    operations["readInitSetupCompletion"] = operation; 
    operation = new mx.rpc.remoting.Operation(null, "writeInitSetupCompletion"); 
    operations["writeInitSetupCompletion"] = operation; 

    _serviceControl.operations = operations; 
    _serviceControl.convertResultHandler = com.adobe.serializers.utility.TypeUtility.convertResultHandler; 
    _serviceControl.source = "ConfigurationService"; 
    _serviceControl.endpoint = "gateway.php"; 


    preInitializeService(); 
    model_internal::initialize(); 
} 
+0

Я не понимаю, почему ResultEvent.result является ArrayCollection, когда он должен быть объектом (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/rpc/events/ResultEvent. html # result). Вы делаете что-то, чтобы отображать результаты вызова службы как ArrayCollection? Если да, можете ли вы показать этот код? Ассоциативный массив на самом деле не является массивом, он больше похож на словарь или объект. Я бы не ожидал, что вы сможете применить ассоциативный массив к массиву или массиву ArrayCollection. – JeffryHouser

+0

@ www.Flextras.com Я ничего не делаю с результатами, прежде чем он появится в ResultEvent, поэтому я тоже не бросаю его. Фактически, служебный код создается с помощью мастера службы FlashBuilder. Я отредактировал вопрос и добавил код службы конструктора, где вы можете видеть, что для типа 'readInitSetupCompletion' используется тип результата' Object'. Однако при вызове 'convertResultHanler' тип результата изменяется с [] на' ArrayCollection'. Но я не могу найти код src для 'convertResultHanler'. Я был бы очень доволен, когда он остался бы как «Объект», поэтому я мог бы надеяться получить доступ к его свойствам. – Kuba

+0

Я не знаю о методе, и он не входит в поиск Google; но мое подозрение в том, что этот метод превращает что-то таким образом, что этого не должно быть. – JeffryHouser

ответ

1

Так что здесь произошло является то, что Массив, который служит в качестве источника для вашего ArrayCollection, действует как общий объект с теми же двумя свойствами. Вероятно, сгенерированный код предполагает, что вы всегда получите больше одного объекта и возникли проблемы, когда ваши данные не соответствуют предположениям, сделанным инженерами Adobe. Одна из причин, по которым мне не нравится сгенерированный код :-).

Ознакомьтесь с этими ресурсами о том, как «сворачивать свои собственные».

  1. Thoughts on Remoting
  2. AMFPHP to Flex Object Relational Mapping
  3. Implementing PHP Services

Я думаю, что это последний (3) находится ближе всего к тому, что вы, вероятно, в PHP. Если вы решите пойти с VO, вы, вероятно, можете просто добавить $ explicitType к возврату строки и не нуждаться в слишком большом изменении на стороне PHP. Вероятно, вам придется регенерировать свои службы, если вы идете по этому маршруту, потому что я подозреваю, что сгенерированный код будет другим.Хорошей новостью является то, что инженеры Adobe, вероятно, сделали, подумайте о случае, когда у вас есть явный тип, но только одна запись.

Еще одно решение - просто проверить свой AC на наличие источника нулевой длины, который не является нулевым и ищет ваши свойства по краям этого.

+0

Спасибо за ответ. Первый абзац вашего предложения предполагает, вероятно, хорошее объяснение, которое заставило меня понять, что ArrayCollection может быть просто набором возвращаемых объектов (но свойства не соответствуют правилам ArrayCollection - они разные, поэтому они не распознаются), если не указано используя явный тип. Вот почему я использую явный тип сейчас. Я пошел с сгенерированным кодом только потому, что считал, что проще управлять службами данных, но это немного сложно. В следующий раз я попробую по вашим ссылкам и посмотрю, для чего лучше. Спасибо :) – Kuba

+0

Aah, я вижу неплохое предложение в вашем последнем абзаце, но я не вижу, как бы это реализовать - в частности, поиск свойств из не нулевого источника. Можете ли вы дать мне какой-то намек? – Kuba

+0

Если это нулевая длина, то используется часть «объект», которая, вероятно, выведет ее свойства с помощью a для каждого цикла. –