Доступ к элементам, определенным в MXML, из внешней AS - PullRequest
2 голосов
/ 23 февраля 2009

У меня есть MXML с формой, а внутри нее два TextInputs. Я ненавижу иметь какой-либо кусок кода внутри файла MXML (я пришел из JavaScript), поэтому я использую

mx:Script source="external.as"

тег для включения любого кода, используемого в любом файле MXML. Проблема в том, что если у меня есть этот код в файле 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;
}

Где marketInput ,gmentInput, priceLowInput и priceHighInput являются TextInputs, определенными в файле MXML. Когда я пытаюсь скомпилировать, я получаю 1120: доступ к неопределенному свойству XXXXX

Я попытался добавить следующие строки перед функцией:

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

Но вместо этого я получаю 1151: существует конфликт с определением XXXX во внутреннем пространстве имен , что имеет смысл.

Есть ли способ сделать это, не передавая все входные ссылки на функцию в качестве параметров?

Ответы [ 5 ]

5 голосов
/ 23 февраля 2009

Вам необходимо создать ссылку на экземпляр родительского контейнера TextInputs, а затем использовать эту ссылку для оценки TextInputs и их свойств. Я думаю, что мы нуждаемся в некотором уточнении вашей файловой структуры. Как вы создаете экземпляр родительского контейнера? Я думаю, это то, что вам нужно сделать:

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;
        }
    }
}
3 голосов
/ 23 февраля 2009

Выполнение «кода» в Flex является болезненным. Не существует понятия частичных классов или гибкости наследования прототипов, как в Javascript. Google для "кода в гибкой" для многих ресурсов.

Думаю, лучше привыкнуть к встраиванию кода в mxml. Используйте теги сценария, максимально избегая встроенного кода. Если вам нужно написать много кода в MXML, возможно, вы захотите повторно разделить код на несколько пользовательских компонентов. Бонусные баллы, если они могут быть использованы повторно.

2 голосов
/ 22 декабря 2010

Канонический способ выполнения кода в Flex - через наследование. Вот хорошее объяснение из документов: http://learn.adobe.com/wiki/display/Flex/Code+Behind. В двух словах:

  1. Объявите класс ActionScript для использования в качестве базового класса.
  2. Установите базовый класс в качестве корневого контейнера в вашем файле MXML.
  3. Для любых элементов управления, объявленных в вашем файле MXML, вы должны повторно объявить их как публичные члены базового класса, используя точно такое же имя (точно так же, как вы делаете выше для блока скрипта с тегом источника, только это работает :-)

Итак, ваш файл ActionScript:

package mypackage
{
    import mx.controls.TextInput;

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

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

И соответствующий файл MXML:

<?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>

и так далее для других элементов управления TextInput. И теперь ваша функция populateFromForm должна работать.

Немного отвратительно пересматривать одни и те же объекты дважды, но это не совсем больно, как об этом говорил ранее респондент (хотя, возможно, это изменилось во Flex 4, чтобы сделать его менее болезненным, чем было) ).

1 голос
/ 27 июля 2011
  • импортировать это в .AS:

    import mx.core.Application;

  • в .AS использовать это:

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

0 голосов
/ 23 февраля 2009

есть ли в вашем mxml-файле тег сценария, указывающий на файл ActionScript?


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

...