Question

J'ai un MXML avec une forme, et à l'intérieur, deux TextInputs. Je déteste avoir tout morceau de code dans le fichier MXML (je viens d'une formation JavaScript) donc j'utiliser un

mx:Script source="external.as"
balise

pour inclure tout code utilisé dans un fichier MXML. Le problème est que si je le code sur le fichier 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;
}

Où marketInput, segmentInput, priceLowInput et priceHighInput sont TextInputs définis dans le fichier MXML. Lorsque je tente de complile je reçois un 1120: L'accès à la propriété non définie XXXXX

Je l'ai essayé d'ajouter ces lignes avant la fonction:

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

Mais au lieu que je reçois un 1151:. Un conflit existe avec la définition XXXX dans l'espace de noms interne qui est parfaitement logique

Est-il possible de le faire sans avoir à passer toutes les références d'entrée à la fonction en tant que paramètres de celui-ci?

Était-ce utile?

La solution

Faire un "code-behind" est douloureuse dans Flex. Il n'y a pas de notion de classes partielles ou la flexibilité de l'héritage prototypal comme en Javascript. Google pour "code-behind flex" pour de nombreuses ressources.

Je pense qu'il vaut mieux vous habituer à l'idée de code d'intégration dans MXML. Utilisez les balises de script en évitant le code en ligne autant que possible. Si vous devez écrire beaucoup de code dans MXML, peut-être vous voudrez peut-être re-facteur le code en plusieurs composants personnalisés. Les points de bonus si elles sont réutilisables.

Autres conseils

Vous devez créer une référence à une instance du conteneur parent de TextInputs, et ensuite utiliser cette référence à accsess les TextInputs et leurs propriétés. Je pense que nous avons besoin des éclaircissements sur la structure de votre fichier. Comment allez-vous créer l'instance du conteneur parent? Je pense que c'est ce que vous devez faire:

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;
        }
    }
}

La façon canonique faire code-behind en Flex est par héritage. Voici une bonne explication de la documentation: http://learn.adobe.com/wiki / affichage / Flex / code + Derrière . En bref:

  1. Déclarer une classe ActionScript à utiliser comme classe de base.
  2. Définissez la classe de base comme le conteneur racine dans votre fichier MXML.
  3. Pour tous les contrôles déclarés dans votre fichier MXML, vous devez les redéclarer en tant que membres publics de la classe de base en utilisant exactement le même nom (exactement comme vous le faites ci-dessus pour votre bloc de script avec la balise source, que cela fonctionne :-)

Ainsi, votre fichier ActionScript:

package mypackage
{
    import mx.controls.TextInput;

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

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

Et le fichier MXML correspondant:

<?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 ainsi de suite pour vos autres contrôles TextInput. Et maintenant, votre fonction populateFromForm devrait fonctionner.

Il est une sorte de odieux d'avoir redéclarer les mêmes entités deux fois, mais il est pas tout à fait le sac de mal à l'intimée plus tôt fait avéré être (bien qu'il soit possible cela a changé dans Flex 4 pour le rendre moins douloureux que c'était ).

  • importer cela dans .AS:

    import mx.core.Application;

  • dans les .AS utilisent ceci:

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

Avez-vous une balise de script dans votre fichier MXML qui pointe vers votre fichier ActionScript?


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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top