Отправка пользовательского события из компонента повторителя и прослушивание события в других компонентах повторителя - PullRequest
1 голос
/ 04 мая 2011

У меня есть компонент повторителя с пользовательским событием. Мои компоненты повторителя запускают пользовательские события, содержащие данные. Мне нужно отправить событие, чтобы другие компоненты ретранслятора могли получить доступ к данным из компонента диспетчеризации. Нужна помощь?

Редактировать: здесь добавлен весь материал.

    <!-- AttributeMapping.mxml -->
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     xmlns:mx="library://ns.adobe.com/flex/mx" width="100%" height="40"
     creationComplete="creationCompleteHandler(event)">

<fx:Metadata>
    [Event(name="mappingChanged", type="MappingChangeEvent")]
</fx:Metadata>

<fx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;
        import mx.collections.ArrayList;
        import mx.events.FlexEvent;
        import mx.events.ValidationResultEvent;
        import mx.validators.ValidationResult;

        import spark.events.IndexChangeEvent;

        private var mappedAttribute:String;

        [Bindable]
        private var _sourceAttribute:String;

        [Bindable]
        private var targetAttributeCollection:ArrayCollection = new ArrayCollection();

        private var _targetAttributes:Array;

        private var _targetAttribute:String;

        public function get targetAttribute():String
        {
            return _targetAttribute;
        }

        public function get targetAttributes():Array
        {
            return _targetAttributes;
        }

        public function set targetAttributes(value:Array):void
        {
            _targetAttributes = value;
            targetAttributeCollection.source = _targetAttributes;
        }

        public function get sourceAttribute():String
        {
            return _sourceAttribute;
        }

        public function set sourceAttribute(value:String):void
        {
            _sourceAttribute = value;
        }

        protected function creationCompleteHandler(event:FlexEvent):void
        {
            this.addEventListener(MappingChangeEvent.MAPPING_CHANGED, mappingsChanged);
        }

        protected function mappingsChanged(event:MappingChangeEvent):void
        {
            lblFuck.text = event.MappedAttribute();
        }

        protected function cmbTargetAttribute_changeHandler(event:IndexChangeEvent):void
        {
            this._targetAttribute = cmbTargetAttribute.selectedItem as String;
            dispatchEvent(new MappingChangeEvent(MappingChangeEvent.MAPPING_CHANGED, true, _targetAttribute));  
        }

    ]]>
</fx:Script>
<s:Label text="{_sourceAttribute}" x="10" verticalCenter="0" id="lblSourceAttribute"/>
<!-- <s:DropDownList y="9" right="10" id="ddlTargetAttribute" dataProvider="{targetAttributeCollection}" width="217" prompt="Select target attribute..."/> -->
<s:ComboBox  id="cmbTargetAttribute" change="cmbTargetAttribute_changeHandler(event)" dataProvider="{targetAttributeCollection}" right="10" verticalCenter="0"/>

<!-- Main.mxml -->
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx" 
           minWidth="955" minHeight="600" xmlns:controls="*">
<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>

<fx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;
        import mx.events.ValidationResultEvent;
        import mx.validators.ValidationResult;

        [Bindable]
        private var targetAttributes:Array = new Array("Product Name", "Price", "Weight", "Lot Size", "Currency", "VAT", "Maximum Order Quantity");

        [Bindable]
        private var sourceAttributes:Array = new Array("Name", "Price", "Product Weight", "Size", "Currency", "VAT", "Max Order Quantity");

    ]]>
</fx:Script>
<mx:VBox width="492" top="10" bottom="10" left="28">
    <mx:Repeater id="attributeMap" dataProvider="{sourceAttributes}">
        <controls:AttributeMapping targetAttributes="{targetAttributes}" sourceAttribute="{attributeMap.currentItem}"/>
    </mx:Repeater>
</mx:VBox>

<!-- MappingChangeEvent.as -->
package
{
    import flash.events.Event;

    public class MappingChangeEvent extends Event
    {
    public static const MAPPING_CHANGED:String = "mappingChanged";

    private var attribute:String;

    public function MappingChangeEvent(type:String, bubbles:Boolean, attribute:String)
    {
        super(type, bubbles);
        this.attribute = attribute;
    }

    override public function clone():Event
    {
        return new MappingChangeEvent(type, bubbles, attribute);
    }

    public function MappedAttribute():String
    {
        return this.attribute;
    }
    }
}

1 Ответ

1 голос
/ 09 мая 2011

О боже, что за гибриды Flex 3 и Flex 4. Если вы собираетесь использовать Flex 4, используйте все компоненты Spark. VBox, Canvas, Repeater имеют искровой эквивалент; VGroup, Group и DataGroup соответственно.

Я бы порекомендовал вам использовать DataGroup вместо Repeater, так как известно, что повторитель имеет проблемы, плюс DataGroup проще в управлении. Просто нужно добавить пользовательский рендерер элементов, чтобы делать все, что вы хотите.

Текущая проблема, с которой вы столкнулись - это проблема самого ретранслятора, поскольку все «дочерние элементы» ретранслятора находятся в пределах его собственной области действия, и все, что связано с внешней стороной ретранслятора, будет молча терпеть неудачу. Этого можно избежать, используя DataGroup и используя надлежащие данные в, концепции события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...