如何将参数传递给之前在Flex Mobile Project中显示的视图(我不能使用pushView)

时间:2013-08-29 22:28:53

标签: flex flash-builder textinput flex-spark

我正在开发一个Flex Mobile项目。我试图将参数从一个视图传递到另一个视图。唯一的问题是我无法使用navigator.pushView来推送View和参数,因为我推送的视图是上一个视图。所以这会使用addHandler()和returnObjectsCreated()消除,因为我无法使用pushView。我不得不使用popView,因为我之前的观点是我必须传递参数。任何帮助将不胜感激。

具有我需要传递的参数的类如下所示。这是一个显示列表的视图。所以我需要将list.selectedItem传递给popview或以前的视图......

<?xml version="1.0" encoding="utf-8"?>
<amec:BaseBrowseView xmlns:fx="http://ns.adobe.com/mxml/2009" 
              xmlns:s="library://ns.adobe.com/flex/spark" 
              xmlns:amec="com.amec.Components.*"
              title="Select an item">

<fx:Script>
    <![CDATA[
        import com.amec.BaseSql;

        import mx.collections.ArrayCollection;
        import mx.events.FlexEvent;

        import spark.events.IndexChangeEvent;

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

        protected function myList_changeHandler(event:IndexChangeEvent):void 
        {

            navigator.popView();


            //Either send a ref to the last view or override createReturn

        }


        [Bindable(event="myDataChanged")]
        private function get myData():ArrayCollection
        {

                           }



    ]]>
</fx:Script>

<s:List id="list"         
        height="100%" width="100%" 
        dataProvider="{myData}" 
        labelField="DMV_VALUE_1"
        change="myList_changeHandler(event);">
</s:List>


<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>

现在下面是我想要popView的前一个视图,我需要传递参数,以便我可以填充TextInput。

<?xml version="1.0" encoding="utf-8"?>
<amec:BaseControl xmlns:fx="http://ns.adobe.com/mxml/2009" 
              xmlns:s="library://ns.adobe.com/flex/spark" 
              xmlns:amec="com.amec.Components.*"
              horizontalCenter="true">

<fx:Script>
    <![CDATA[
        import mx.events.FlexEvent;

        [Bindable]
        protected var textValue:String;

        protected function control_creationCompleteHandler(event:FlexEvent):void
        {
            // todo: get control data from view.data


        }

        protected function control_clickHandler(event:MouseEvent):void
        {

            parentView.navigator.pushView(TextListView);

        }




    ]]>
</fx:Script>

<s:Label text="Robert says something meaningful goes here" />

<s:TextInput id="ns" text="{textValue}" editable="false" click="control_clickHandler(event)"/>





<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>

我再次无法使用pushView,因为视图已经在堆栈中。

2 个答案:

答案 0 :(得分:2)

如果您想以正确的方式执行此操作,请在上一个视图(您希望结果进入的视图)中为“添加”添加eventListener。

protected function addHandler(event:FlexEvent) : void {
if (navigator.poppedViewReturnedObject != null) {
                var returnedObject : Array = navigator.poppedViewReturnedObject.object as Array;
                if(!returnedObject) return;
                yourData= new ArrayCollection(returnedObject);
            }

}

在您要传递对象的视图上:

override public function createReturnObject():Object {
            var returnedObject : Object = new Object();
            returnedObject = dataYouWantToSendBack;
            return returnedObject;
        }

答案 1 :(得分:-1)

我看了一下使用静态变量,但是有点乱,我也看了一下使用依赖注入,但花了几个小时来设置框架并让它运行是因为我所做的只是传递参数popView,所以我想到的是我在使用Android SDK进行原生Android应用时使用的类似方法。一个有吸气剂和二传手的单身人士。 基本上我能够做到这一点的方法是使用Singleton sharedInstance。请参阅以下代码:

package com.controls.Text
{
    import flash.utils.Dictionary;
    [Bindable]

    public class ParameterManager
    {
        private static var instance:ParameterManager = new ParameterManager();
        private var dictionary:Dictionary=new Dictionary(); 


        public function ParameterManager( )
        {
        if (instance != null) { throw new Error('Must use ParameterManager.getInstance().') }
        }

        public static function getInstance(): ParameterManager {
            return instance;
        }

        public function setParameter(key:*, value:*):void
        {
        dictionary[key]=value;  
        }

        public function getParameter(key:*):*
        {
            return dictionary[key];
            }
    }
}

设置参数值的方法:

        protected function myList_changeHandler(event:IndexChangeEvent):void 
        {
            var listViewReturnObject:String = new String();
            listViewReturnObject = list.selectedItem.DMV_VALUE_1;
            ParameterManager.getInstance().setParameter("selectedItem", listViewReturnObject);

            navigator.popView();
        }

获取值的方法:

        protected function control_creationCompleteHandler(event:FlexEvent):void
        {               
            var listViewReturnObject:Object = new Object();

            listViewReturnObject= ParameterManager.getInstance().getParameter("selectedItem");
            if (listViewReturnObject != null)
            {
                dataTxt.text= String(listViewReturnObject);
                ParameterManager.getInstance().setParameter("", null); //Make sure objects are cleared when done.
            }
        }