Bem, último post antes de reformular o código e ganhar juízo. Já perdi tempo
suficiente com isto:
PHP (umVO.php) :
class getOFcilindrosVO
{
var $num_of;
var $posicao;
var $obs1;
var $obs2;
var $obs3;
var $getofcilcores = array();
var $_explicitType = "vo.getOFcilindrosVO";
Flex (umVO.as);
[RemoteClass(alias="vo.getOFcilindrosVO")]
[Bindable]
public class getOFcilindrosVO {
public var num_of:Number;
public var obs1:Text;
public var obs2:Text;
public var obs3:Text;
public var posicao:Number;
public var getofcilcores:ArrayCollection = new ArrayCollection(); //
(*)VER COMENTÁRIO ABAIXO
}
Do PHP é enviada a estrutura correcta, com Array no getofcilcores, e
preenchido com o segundoVO.
(*) Se no Flex tiver esta var em Array, o event.result entra com Array e
Object, com dados. Basta esta var estar em ArrayCollection e simplesmente os
dados não entram no flex e recebo um TypeError: Error #1034: Falha de
coerção de tipo: não é possível converter [...@31589d99 em
mx.collections.ArrayCollection. Entendo o erro, mas antes de este ser
gerado, podia-me dar a possibilidade de converter o result em
ArrayCollection, ou seja, a conversão é tentada antes de me permitir o que
quer que seja. O que também entendo que seja por usar VOs, mas qual é a
solução à volta disto? Não é possivel usar VOs dentro de VOs? Se usar um VO
fico limitado a algumas estruturas de dados?
Com VO sou obrigado a lidar com o que me é fornecido, já que o Flex não me
deixa tratar as entradas, isto porque não entra nada. Ou tenho o VO igual ao
do PHP, o que limita em estruturas. :-P
Desculpem a insistência no assunto, mas não encontro absolutamente nada que
me ajude na internet, e já li imensos exemplos, mas nenhum com subniveis de
VOs.
Por outro lado, é possivel fazer as conversões de estruturas no construct da
classe do VO? Algo assim:
public class getOFcilindrosVO {
public var num_of:Number;
public var obs1:Text;
public var obs2:Text;
public function getOFcilindrosVO(entrada:Object):void{
// conversões e afins aqui, que imagino sejam executadas antes do
result chegar ao flex, ou melhor, antes de me permitir fazer alguma coisa no
command.
}
E chega. Qualquer resposta ou direcção a tomar, agradeço, ou vou converter
os VOs em apenas 1 nivel e criar várias outras estruturas.
Muitissimo obrigado.
MV
2009/4/24 Miguel Vaz <[email protected]>
>
> Isso é precisamente o que já experimentei, mas os dados não são
correctamente atribuidos, ficando o arraycollection a 0. Não entendo mesmo
porquê. Se for array, funciona, já que os dados regressam do php como array,
mas se tentar colocar os dados num arraycollection dessa forma, não
funciona.
>
> Parece-me que vou ter de dividir os dados em estruturas diferentes, todas
de 1 nivel, ao invés do que pretendia fazer, vários niveis de VOs.
>
>
> MV
>
>
>
>
> 2009/4/24 rui <[email protected]>
>>
>> Miguel Vaz escreveu:
>> >
>> > Sim, entendo que o Array não faça dispatch de eventos, e pretendo que
>> > a estrutura seja ArrayCollection, mas o problema é que essa (com
>> > array) é a única forma de conseguir que o flex receba os dados, embora
>> > erradamente, com a estrutura interior não como VO, mas como Object.
>> >
>> > Mesmo fazendo casting do array do result que tem os VOs secundários, o
>> > flex simplesmente ignora os dados, mantendo o arraycollection null.
>> >
>> > Amanhã farei novos testes, mas admito que isto me está a deixar pelos
>> > cabelos. Mais porque acho que estou a entender o processo, e mesmo
>> > assim algo falha.
>> >
>> > MV
>> >
>> >
>> >
>> >
>> > 2009/4/23 Nuno Fernandes <[email protected]
>> > <mailto:[email protected]>>
>> >
>> >
>> > Podes sim ter VO's dentro de ArrayCollection emq ue o
>> > ArrayCollection é
>> > uma propriedade de outro VO, so que o exemplo que deste na classe
>> >
>> > public var getofcilcores:Array = new Array();
>> >
>> > o getofcilcores é um Array e não um ArrayCollection, logo não é
>> > capaz de
>> > efectuar o dispatch the eventos caso haja alterações.
>> >
>> > da seguinte forma é capaz de dar menos problemas
>> >
>> > public var getofcilcores:ArrayCollection = new ArrayCollection ();
>> >
>> > se tudo estiver correcto não deveras ter problemas a passar a info
do
>> > PHP para o FLEX e vice-versa
>> >
>> >
>> > Miguel Vaz escreveu:
>> > >
>> > > Já tenho tudo mais ou menos a funcionar, apenas com uma dúvida:
>> > >
>> > > E se pretender ter um VO dentro de outro VO? Não da forma como no
>> > > exemplo do João Fernandes, em que um segundo VO existe dentro do
>> > > primeiro, mas apenas uma vez, e sim ter, por exemplo, um VO com
uma
>> > > propriedade que será um arraycollection de outro tipo de VO.
>> > >
>> > > Algo assim:
>> > >
>> > >
>> > > package vo
>> > > {
>> > > import com.adobe.cairngorm.vo.IValueObject;
>> > >
>> > > import mx.controls.Text;
>> > >
>> > > [RemoteClass(alias="vo.getOFcilindrosVO")]
>> > >
>> > > [Bindable]
>> > > public class getOFcilindrosVO implements IValueObject {
>> > >
>> > > public var num_of:Number;
>> > >
>> > > public var obs1:Text;
>> > > public var obs2:Text;
>> > > public var obs3:Text;
>> > >
>> > > public var posicao:Number;
>> > >
>> > > public var getofcilcores:Array = new Array(); // aqui
>> > fica um
>> > > arraycollection de VOs
>> > >
>> > >
>> > > }
>> > > }
>> > >
>> > > O getofcilcores é um array que terá um outro VO em cada indice. O
>> > > problema é que o interior é recriado como Object. Do PHP os dados
>> > > regressam correctamente, um VO com propriedades e um Array com
>> > indices
>> > > como VOs. A transferência é que falha.
>> > >
>> > > A questão é se deverei ter uma função dentro do VO para
transferir
>> > > valor a valor e construir devidamente o getofcilcores como
>> > > arraycollection de VOs.
>> > >
>> > > Confuso? :-)
>> > >
>> > > Algo como ter um pessoasVO que tem uma propriedade que é uma
>> > lista de
>> > > hoteisVO, por exemplo.
>> > >
>> > > De qualquer forma, muito obrigado pelas dicas, foram extremamente
>> > > esclarecedores, acho que já entendi como posso lidar
>> > convenientemente
>> > > com VOs. Apesar de darem algum trabalho, os dados ficam melhor
>> > > estruturados e com extras acrescidos.
>> > >
>> > > MV
>> > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > 2009/4/23 Nuno Fernandes <[email protected]
>> > <mailto:[email protected]>
>> > > <mailto:[email protected] <mailto:[email protected]>>>
>> > >
>> > >
>> > > Pois Miguel o teu problema é estares a usar o
>> > > modelo.OFgeral[posicao].propriedade="dados".
>> > >
>> > > O que se passa é que esse tipo de alterações não fazem que o
>> > > ArrayCollection faça o dispatch do evento CollectionChange.
>> > A melhor
>> > > forma é mesmo como eu exemplifiquei,
>> > >
>> > > modelo.OFgeral.removeItemAt(posicao)
>> > > modelo.OFgeral.addItemAt(posicao,null)
>> > > o metodo addItem provoca o dispatch do evento
>> > CollectionChange e tudo
>> > > começa a funcionar.
>> > >
>> > > o que tu chamaas de "limpar" ou "atribuição"do ponto de
>> > vista do
>> > > ArrayCollection é a mesma coisa, alteração em um item. Eu
>> > geralmente o
>> > > que faço é no VO do FLEX tenho um campo que me indica se o
>> > item é para
>> > > ser usado, visível, ou qualquer outra coisa, e faço a
>> > alteração a esse
>> > > nivel, assim sempre posso ter filterFunctions associadas ao
>> > > ArrayCollection e outras coisas mais :D
>> > >
>> > > Abraços
>> > >
>> > > Miguel Vaz escreveu:
>> > > >
>> > > > No meu modelo eu tenho:
>> > > >
>> > > > OFgeral:ArrayCollection = new ArrayCollection();
>> > > >
>> > > > Antes de fazer a chamada à base de dados, tenho uma rotina
que
>> > > corre o
>> > > > OFgeral à procura de posições disponíveis (que se traduzem
em
>> > > janelas
>> > > > abertas), onde irá colocar os resultados. Daí existir no
>> > command
>> > > > apenas uma atribuição e não um addItem. O addItem só é
>> > feito uma
>> > > vez,
>> > > > antes da chamada à BD, se a posição estiver abtera, caso
>> > contrário
>> > > > apenas limpo os dados nessa posição
>> > (modelo.OFgeral[posicao]=null) e
>> > > > reinsiro o VO.
>> > > >
>> > > > Os meus binds, como no exemplo do text, são sempre
>> > > > {modelo.OFgeral.getItemAt(posicao).propriedade}, para
>> > atribuições,
>> > > > faço modelo.OFgeral[posicao].propriedade="dados".
>> > > >
>> > > > De qualquer forma, de momento não posso fazer nenhum
>> > teste, já que
>> > > > estou em casa, mas amanhã vou analisar melhor a situação e
>> > deixo
>> > > aqui
>> > > > o que encontrar. Vou rever melhor o código e ver se existe
>> > alguma
>> > > > coisa que me está a escapar, já que o projecto começa a
>> > ganhar uma
>> > > > dimensão considerável.
>> > > >
>> > > > Agradeço imenso o tempo e a paciência que estão todos a
ter.
>> > > Aprecio o
>> > > > esforço, já que isto dos VOs é mais uma lacuna nos meus
>> > > conhecimentos.
>> > > > Lacuna de um assunto que considero bastante importante
>> > para uma
>> > > > eficiente gestão/organização de transmissão de dados.
>> > > >
>> > > > Quem sabe daqui a uns meses vos dou um assunto
>> > interessante para uma
>> > > > eventual apresentação num dos eventos. ;-) O projecto que
>> > estou a
>> > > > desenvolver é algo um pouco à margem do habitual em
>> > projectos de
>> > > flex,
>> > > > e poderá ser interessante como case study para mostrar
algumas
>> > > > utilizações menos vistas com flex.
>> > > >
>> > > > MV
>> > > >
>> > > >
>> > > >
>> > > >
>> > > >
>> > > > 2009/4/22 Nuno Fernandes <[email protected]
>> > <mailto:[email protected]>
>> > > <mailto:[email protected] <mailto:[email protected]
>>
>> > > > <mailto:[email protected]
>> > <mailto:[email protected]> <mailto:[email protected]
>> > <mailto:[email protected]>>>>
>> > > >
>> > > >
>> > > > Bom tenho que vazar, mas aqui fica a info
>> > > >
>> > > > 1. o OFgeral _*TEM*_ que ser do tipo ArrayCollection,
se
>> > > for um
>> > > > Array, não há bandings
>> > > > 2. para "mexeres" num ArrayCollection não usamos a
mesma
>> > > técnica do
>> > > > Array [index], usamos os metodos
getItemAt(index),
>> > > > addItemAt(index) e removeItemAt(index) por exemplo
>> > > >
>> > > > Se o OFgeral for um ArrayCollection nas labels só tens
que
>> > > colocar:
>> > > >
>> > > > text="{modelo.OFgeral.getItemat(1).num_of}"
>> > > >
>> > > > mas na function result isto :
>> > > >
>> > > > modelo.OFgeral[posicao]= tempor;
>> > > >
>> > > > deve ser substituido por
>> > > >
>> > > > modelo.OFgeral.addItemAt(posicao, tempor);
>> > > >
>> > > > Mas le a DOC sobre esses métodos, porque no caso do
>> > > addItemAt se nesse
>> > > > index já existir algo, esse conteudo passa para o index
a
>> > > seguir e
>> > > > assim
>> > > > sucessivamente, se quiseres alterar o conteudo de um
>> > index no
>> > > > ArrayCollection o que deves fazer é primeiro removes e
>> > depois
>> > > > adicionas.
>> > > >
>> > > > Abraços
>> > > >
>> > > >
>> > > >
>> > > > >
>> > >
>> > >
>> > >
>> > >
>> > >
>> > > >
>> >
>> >
>> >
>> >
>> >
>> > >
>> Podes ir a propriedades source do arrayCollection que basicamente é um
>> array normal.
>>
>> logo terias:
>>
>> public var getofcilcores:ArrayCollection = new ArrayCollection ();
>> getofcilcores.source = evt.result as array
>>
>>
>> não sei se era isto que querias...
>>
>> abraço,
>> rui cruz
>>
>>
>>
>> >>
>
--~--~---------~--~----~------------~-------~--~----~
Recebeu esta mensagem porque está inscrito em Grupo "Mailing List da Comunidade
Portuguesa de Rich Internet Applications - www.riapt.org" do Grupos Google.
Para enviar mensagens para este grupo, envie um email para
[email protected]
Para anular a inscrição neste grupo, envie um email para
[email protected]
Para mais opções, visite este grupo em
http://groups.google.com/group/riapt?hl=pt-PT
-~----------~----~----~----~------~----~------~--~---