假设我有一个数据网格,并且有一个方法附加到点击网格行中的任何项目。现在,表格行中的一些项目也是按钮。这些中的每一个都与不同的动作相关联。我们只希望执行其中一个操作。以下是一些示例代码:
<mx:DataGrid id="dataGrid" dataProvider="{data}" itemClick="selectRow()">
<mx:columns>
<mx:DataGridColumn dataField="name" />
<mx:DataGridColumn id="choose" headerText="Make a choice">
<mx:itemRenderer>
<mx:Component>
<mx:VBox>
<renderers:MyButton label="Choose Wisely" click="{outerDocument.choiceMade()}"/>
</mx:VBox>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
</mx:columns>
</mx:DataGrid>
我的问题是:
当用户选择行中的按钮项时,将执行两种方法(selectRow&amp; choiceMade)。由于两种方法都是 执行,是两个固定的顺序 不知何故?是按钮方法(choiceMade)总是 在行方法(selectRow)之前触发,是它 相反,或者是他们 两者都是异步执行的?
我正在质疑的是,我们目前有一个成员变量来跟踪进行了哪个选择,并忽略了另一个方法的内容(方法的else部分重置了这个值)。现在,如果方法碰巧以不同的顺序(或同时)执行,则行为将是不可预测的。
我没有很好地处理所有这些如何工作,所以任何关于Flex如何激发这些方法的光都将受到赞赏。成员变量标志是这样做的方式(闻起来很糟糕)?
答案 0 :(得分:1)
两个事件都将被派遣,并且几乎同时发生。在处理事件时,您真的不应该依赖执行顺序。这不是很好的做法。
至于你的具体问题,你可以这样做:
<renderers:MyButton label="Choose Wisely"
click="event.stopImmediatePropagation();
outerDocument.choiceMade()" />
它将阻止click事件通过displaylist传播,因此datagrid将不会收到itemclick事件。单击按钮时不会执行selectrow()方法。