为了说明 Q。我真的会过度简化示例(实际上代码更加复杂)。
假设您有一个 flex 控件,它下面包含一个数据网格。就像是
<mx:DataGrid id="grid" dataProvider="{document.items}">
<mx:columns>
<mx:DataGridColumn headerText="Column 1" dataField="@name"/>
<mx:DataGridColumn headerText="Column 2" dataField="@value"/>
</mx:columns>
</mx:DataGrid>
其中 document 是一个模型对象,包含一些数据。您在控件上提供了一个选择设置器,因为客户端不想知道有关底层数据模型的任何信息:
public function set selectedItem(title:String):Allocation
{
grid.selectedItem = null;
for each(var o:Object in grid.dataProvider)
{
var t:String = o.@title;
if( t == title )
{
grid.selectedItem = o;
return;
}
}
}
到目前为止,一切都很好。如果预先填充了 document.items,则选择将正常工作。然而。如果您在应用程序启动时已经知道选择应该是什么 - 它已经(例如)在 URL 上传递,该怎么办?所以,在 flex 中你可能有类似的东西
// Initialising now...
mycontrol.document = this.document; // give the control the document
// Fetch titles
new FetchTitlesEvent().dispatch(); // cairngorm-style event
// Set the selection
mycontrol.selectedItem = Application.application.parameters.title;
哎呀。因为 FetchTitlesEvent 是异步操作的,当时 mycontrol.selectedItem 是无法工作的。不知何故,我们需要(重新)触发该代码以设置控件上的选择。现在,我有几种方法可以做到这一点,但都有代码气味:
1) 在获取完成后,在 FetchTitlesCommand 中执行此操作 - 这会污染需要知道这一点的视图(或视图s )的命令。感觉就像一场等待发生的维护噩梦,这意味着视图完全绑定到命令,并且这些命令不可重用。布莱赫。
2)当它完成时从事件中回调(或者做一些复合命令,从 FetchTitlesEvent 开始,以一个新命令结束来做集合)。对我来说似乎很脆弱 - 维护者如何知道需要哪些回调?它仍然将 UI 控制知识绑定到命令中。坏事。
3)有某种计时器,等待事件队列静止几秒钟。骇客骇客。
4)在控制中进行。绑定到 document.items 上 mycontrol 中的 collectionevents,监视更改。一旦与选择匹配的行到达,选择它并停止监视更改。- 控制感觉是做这件事的正确地方 - 收集事件有时会引发令人兴奋的 CHANGE 或 REFRESH 事件 - 似乎是一个昂贵的监视器
我非常倾向于(4)。flex-ers 之前是否使用过任何其他选项来解决这个问题 - 特别是是否有任何我可能使用的库编入代码,因为它必须是一个相当通用的问题?