2009-02-23 7 views
2

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

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, segmentInput, priceLowInput и priceHighInput является TextInputs, определенным в файле MXML. Когда я пытаюсь complile я получаю 1120: Доступ к неопределенным собственности ХХХХХ

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

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

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

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

+0

вы могли бы разместить файл MXML? – mmattax

ответ

3

Двигаемся "код-за" Больно в Flex. Нет понятия частичных классов или гибкости прототипального наследования, как в Javascript. Google для «кода в flex» для многих ресурсов.

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

+0

Спасибо большое, я просто сделал. Я просто не согласен с «болезненным» прилагательным, я нашел его на самом деле довольно чистым и легким для понимания (такие вещи, которые вы обычно восклицаете ». Это было так очевидно, я не могу поверить, что я не узнал его себя!") – Chepech

0

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

 

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

Да У меня есть ссылка на скрипт в файле MXML. – Chepech

5

Вам нужно создать ссылку на экземпляр нижестоящего контейнера 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; 
     } 
    } 
} 
2

Канонический способ выполнения кода в 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> 

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

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

1
  • импорт это в .Как:

    import mx.core.Application;

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^