我可以在Flex中的数据绑定操作中添加事件侦听器吗?

时间:2008-08-25 17:56:41

标签: flex data-binding

我有一个ComboBox,我绑定到标准的HTTPService,我想添加一个事件监听器,以便我可以在从数据提供者填充ComboBox后运行一些代码。

我该怎么做?

8 个答案:

答案 0 :(得分:2)

Flex没有像ASP .Net那样的特定数据绑定事件。您必须在第一个答案中注意像John所说的dataProvider属性,而不仅仅是组合框或其dataProvider属性。假设您有这样的设置:

<!-- Assume you have extracted an XMLList out of the result 
and attached it to the collection -->
<mx:HttpService id="svc" result="col.source = event.result.Project"/>
<mx:XMLListCollection id="col"/>

<mx:ComboBox id="cbProject" dataProvider="{col}"/>

现在,如果你设置一个像这样的变换手:

// Strategy 1
ChangeWatcher.watch(cbProject, "dataProvider", handler) ;

当数据返回时,您的处理程序将被触发。为什么?因为 dataProvider 本身没有改变 - 它的底层集合确实如此。要触发它,你必须这样做:

// Strategy 2
ChangeWatcher.watch(cbProject, ["dataProvider", "source"], handler) ;

现在,当您的集合更新后,您的处理程序将被触发。如果您想使用策略1使其工作,在MXML中设置您的dataProvider。而是处理XMLListCollection的 collectionChange 事件,并在AS中覆盖ComboBox的dataProvider。

这些与数据绑定事件完全相同吗?不,但我已经使用过它们,从来没有遇到过问题。如果您希望绝对确保您的数据绑定,只需将changeWatcher放在组合框的selectedItem属性上并在那里进行处理。只是准备好多次触发该事件并妥善处理。

答案 1 :(得分:1)

您可以按照here所述使用mx.binding.utils.ChangeWatcher。

答案 2 :(得分:0)

您可以使用BindingUtils在组合框的dataProvider属性发生更改时收到通知:

BindingUtils.bindSetter(comboBoxDataProviderChanged, comboBox, "dataProvider");

BindingUtils位于mx.binding.utils包中。

我在此处详细介绍了如何使用BindingUtilsDoes painless programmatic data binding exist?

答案 3 :(得分:0)

你也可以在HTTPService上监听ResultEvent.RESULT,我会猜到在编写组合框之前会稍微调用它,但它可能已经足够了。

答案 4 :(得分:0)

与加载数据相比,您在哪里添加侦听器?在添加监听器之前,是否有可能加载数据并触发事件?

答案 5 :(得分:0)

@Herms

在Web服务调用之前肯定添加了监听器,这里是我的代码看起来像的例子(我简化了很多东西......):

我有这个flex组件:


public class FooComboBox extends ComboBox
{
    private var service:HTTPService = null;
    public function ProjectAutoComplete()
    {
        service = new HTTPService();
        service.url = Application.application.poxmlUrl;
        service.addEventListener(FaultEvent.FAULT,serviceFault);
        service.addEventListener(ResultEvent.RESULT,resultReturned);


        this.addEventListener(FlexEvent.DATA_CHANGE,dataChange);
    }
    public function init():void
    {
        var postdata:Object = {};
        postdata["key"] = "ProjectName";
        postdata["accountId"] = Application.application.accountId
        service.send(postdata);
    }
    private function resultReturned(event:ResultEvent):void
    {
        this.dataProvider = service.lastResult.Array.Element;
        // thought I could do it here...but no luck...
    }
    private function dataChange(e:FlexEvent):void
    {
        // combobox has been databound
        mx.controls.Alert.show("databound!");
    }
    ...
}

然后在mxml文件中我有一个ID为“foo”的FooComboBox,我打电话给:


foo.init();

我需要在组合框完全数据绑定之后执行一些代码...任何想法?

答案 6 :(得分:0)

首次设置数据提供程序时,可能不会触发事件?尝试将数据提供程序设置为构造函数中的空数组,这样它肯定会更改,而不是稍后在resultReturned()方法中初始分配。我不知道这是否会有所帮助,但值得一试。

此外,您将提供程序设置为lastResult.Array.Element。这看起来有点可疑,因为数据提供者可能应该是一个数组。当然,我不知道你的数据是什么样的,所以你所拥有的很可能是正确的,但我注意到它可能是相关的。也许它应该只是lastResult.Array?

答案 7 :(得分:0)

在示例代码中,尝试在validateNow()方法中运行resultReturned。这将强制组合框提交其属性。问题是,即使设置了属性,在commitProperties运行之前不会使用新值,它将在下一帧最早执行,validateNow()强制它立即完成