【问题标题】:Flex Listening for Events IssueFlex 监听事件问题
【发布时间】:2010-11-16 20:29:11
【问题描述】:

我对 flex 比较陌生,并且正在尝试弄清楚如何监听我创建的自定义事件。让我先介绍一下我的应用的背景。

我的目录结构如下。

  • 资产
  • 组件
  • 控制
  • 事件
  • 型号
  • 实用程序

在模型类(可绑定)中,我有一个 ArrayCollection,它将通过 Web 服务调用加载数据,并且特定组件中的数据网格将绑定到该 ArrayCollection 并显示数据。 Web 服务通过按下按钮来调用,该按钮通过事件启动搜索。

model/ApplicationModel.as

[Bindable]
public class ApplicationModel
{
    //put specific model components here
    public var data:ArrayCollection;


    //the one instance in this Singleton
    private static var _instance:ApplicationModel;

    public function ApplicationModel()
    {
        if (_instance != null) throw new Error("ApplicationModel already exists!");
    }

    public static function getInstance():ApplicationModel
    {
        if (_instance == null) _instance = new ApplicationModel();
        return _instance;
    }

}

组件/SearchBox.mxml

<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml">

<mx:Script>
    <![CDATA[
        import com.homedepot.di.tp.SCVTools.events.*;

        private function doSearch():void
        {
            var query:String = searchTI.text;

            //only want to dispatch an event if there is something to query
            if (query) dispatchEvent(new CustomEvent(CustomEvent.UPDATE_START,query));
        }
    ]]>
</mx:Script>
    <mx:Label  text="Enter Search Term"/>
    <mx:TextInput id="searchTI" enter="doSearch()" />
    <mx:Button label="Search" click="doSearch()"/>
</mx:HBox>

此搜索功能运行良好,将返回我想要的数据。我需要知道的是何时完成此 Web 服务调用,以便视图组件可以相应地更新视图的其他方面(例如,根据返回的数据隐藏数据网格的列)。

我的 Application.mxml 文件将连接我的控制器以侦听 CustomEvent。然后,控制器将委派工作以实际调用 Web 服务并获取数据。委托将创建一个 HTTPService 对象并获取数据。它还将处理 HTTPService 的结果。我目前正在尝试在处理 HTTPService 调用结果的函数中调度一个新事件。这似乎不起作用,但这是有道理的,因为该事件永远不会冒泡到我的视图组件中。

snippet of control/DataUpdateDelegate.as

 public override function parse(event:ResultEvent):void
    {
        super.parse(event);

        try
        {
            Application.debug("DataUpdateDelegate:parse");
            var data:Object = event.result.records.record;

            model.data = data as ArrayCollection;

            dispatchEvent(new CustomEvent(CustomEevent.UPDATE_END) );
        }
        catch (error:Error)
        {
            handleError(error);
        }   

    }

我试图在 Application.mxml 文件中连接这个 UPDATE_END 事件,但这似乎也不起作用。

对于我的视图如何监听这个不是从子组件而是从对视图组件一无所知的 ActionScript 类分派的事件,是否有人有任何建议?

谢谢,

托马斯

【问题讨论】:

    标签: apache-flex


    【解决方案1】:

    当您的ApplicationModel 首次在您的视图中设置时,您可以使用BindingUtils 将特定函数绑定到data 属性:

    public function set model(applicationModelInstance:ApplicationModel):void
    {
        _applcationModelInstance = applicationModelInstance;
        BindingUtils.bindSetter(dataRefreshed, _applicationModelInstance, "data");
    }
    
    protected function dataRefreshed(value:Object):void
    {
        // do whatever you need to do here. 
        // value==applicationModelInstance.data
    }
    

    取消注册这样的绑定以避免内存泄漏有点棘手,但由于您的 ApplicationModel 是单例,因此您无论如何都不需要。

    【讨论】:

    • 这似乎有效!我期望被调用的函数实际上是被调用的。谢谢!
    猜你喜欢
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多