Pergunta

Eu tenho um MXML com uma forma, e dentro dele, dois TextInputs. Eu odeio ter qualquer pedaço de código dentro do arquivo MXML (Eu venho de uma formação JavaScript) para que eu use um

mx:Script source="external.as"

tag para incluir qualquer código usado em qualquer arquivo MXML. O problema é que se eu tenho esse código no arquivo external.as:

private function populateFromForm():void{
   var vo:ValidObject= new ValidObject();
   vo.market = marketInput.text;
   vo.segment = segmentInput.text;
   vo.priceLow = priceLowInput.text;
   vo.priceHigh = priceHighInput.text;
}

Onde marketInput, segmentInput, priceLowInput e priceHighInput são TextInputs definidos no arquivo MXML. Quando tento complile eu recebo um 1120: Acesso à propriedade indefinida XXXXX

Eu tentei adicionar estas linhas antes da função:

public var marketInput:TextInput;
public var segmentInput:TextInput;
public var priceLowInput:TextInput;
public var priceHighInput:TextInput;

Mas em vez disso eu recebo um 1151:. Existe um conflito com XXXX definição no namespace interno que faz todo o sentido

Existe uma maneira de fazer isso sem ter que passar todas as referências de entrada para a função como parâmetros de ele?

Foi útil?

Solução

Fazendo um "code-behind" é doloroso no Flex. Não existe o conceito de classes parciais ou a flexibilidade da herança prototípica como em Javascript. Google por "code-behind em flex" para muitos recursos.

Eu acho que é melhor você se acostumar com a idéia de incorporar o código em mxml. etiquetas de uso de script evitando código embutido, tanto quanto possível. Se você tem que escrever um monte de código dentro de MXML, talvez você pode querer re-fator o código em vários componentes personalizados. Os pontos de bónus se eles são reutilizáveis.

Outras dicas

Você precisa criar uma referência a uma instância do contêiner pai dos TextInputs, e depois usar essa referência para accsess os TextInputs e suas propriedades. Acho que precisamos de alguns esclarecimentos sobre a sua estrutura de arquivo. Como você está criando a instância do contêiner pai? Eu estou pensando que isso é o que você precisa fazer:

MyForm.mxml:

<?xml version="1.0" encoding="utf-8"?>
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:TextInput id="marketInput" />
    <mx:TextInput id="segmentInput" />
    <mx:TextInput id="priceLowInput" />
    <mx:TextInput id="priceHighInput" />
</mx:VBox>

SaveVOContainer.as:

package
{
    public class SaveVoContainer extends Container
    {
        private var myForm:MyForm = new MyForm();

        public function SaveVOContainer
        {
            this.addChild(myForm);
        }

        private function populateFromForm():void{
           var vo:ValidObject= new ValidObject();
           vo.market = myForm.marketInput.text;
           vo.segment = myForm.segmentInput.text;
           vo.priceLow = myForm.priceLowInput.text;
           vo.priceHigh = myForm.priceHighInput.text;
        }
    }
}

A forma canônica para fazer code-behind no Flex é através de herança. Aqui está uma boa explicação dos docs: http://learn.adobe.com/wiki / display / Flex / Código + Atrás . Em poucas palavras:

  1. Declarar uma classe ActionScript para usar como sua classe base.
  2. Definir a classe base como o container raiz em seu arquivo MXML.
  3. Para quaisquer controles declarou em seu arquivo MXML, você tem que redeclare-los como membros públicos da classe base usando o mesmo nome (exatamente como você está fazendo acima para o seu bloco de script com marca de origem, só que funciona :-)

Então, o arquivo ActionScript:

package mypackage
{
    import mx.controls.TextInput;

    public class myClass extends WindowedApplication
    {
        public var marketInput:TextInput;

        private function populateFromForm():void{
            /* As above */
        }
    }
}

E o arquivo MXML correspondente:

<?xml version="1.0" encoding="utf-8"?>
<custom:myClass xmlns:custom="mypackage.*"
        xmlns:fx="http://ns.adobe.com/mxml/2009"
        xmlns:s="library://ns.adobe.com/flex/spark" 
        xmlns:mx="library://ns.adobe.com/flex/mx">
    <mx:TextInput id="marketInput"/>
</custom:myClass>

Et cetera para seus outros controles TextInput. E agora a sua função populateFromForm deve funcionar.

É uma espécie de hediondo ter redeclare as mesmas entidades duas vezes, mas não é bem o saco de doer o entrevistado mais cedo tornou-se (embora seja possível isso mudou no Flex 4 para torná-lo menos doloroso do que era ).

  • importar este em .AS:

    import mx.core.Application;

  • nos .AS usar este:

    mx.core.Application.application.component.property = value; mx.core.Application.application.myText.text = 'test';

você tem uma tag de script em seu arquivo mxml que aponta para o arquivo ActionScript?


<mx:Script source='includes/foo.as' />

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top