2011-06-07 29 views
0

假設我有一個數據網格,並且有一個方法用於單擊網格中某行的任何項目。現在,表格行中的一些項目也是按鈕。其中每個都與不同的操作相關聯。我們只想要執行這些操作之一。下面是一些示例代碼:Flex數據網格中有嵌套項目時的事件順序

<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 & choiceMade)被執行。由於兩種方法都執行 ,是否固定 以某種方式的順序?行方法(selectRow)之前觸發的按鈕方法(choiceMade)始終是 ,反之亦然 ,或者它們是 都是異步執行的?

我在質疑的事情是,我們目前有一個成員變量來跟蹤哪個選擇被做出,並忽略其他方法的內容(方法的其他部分重置此值)。現在,如果這些方法恰好以不同的順序(或同時)執行,那麼行爲將是不可預測的。

我沒有很好的處理所有這些如何工作,所以任何關於Flex如何觸發這些方法的問題都將不勝感激。成員變量是否標誌着這樣做的方式(它聞起來很糟糕)?

回答

1

這兩個事件都將被調度,並且它會在相同的時間發生。在處理事件時,你真的不應該指望執行順序。這不是很好的做法。

至於你具體的問題,你可以這樣做:

<renderers:MyButton label="Choose Wisely" 
        click="event.stopImmediatePropagation(); 
          outerDocument.choiceMade()" /> 

它將從通過顯示列表傳播,因此數據網格將不會收到itemClick事件停止click事件。單擊按鈕時,selectrow()方法將不會執行。