我有一个ComboBox,我绑定到标准的HTTPService,我想添加一个事件监听器,以便我可以在从数据提供者填充ComboBox后运行一些代码。
我该怎么做?
答案 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
包中。
我在此处详细介绍了如何使用BindingUtils
:Does 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()
强制它立即完成