2011-09-08 50 views
0

所以我的問題是沒有更新的selectedIndex當我使用nextSlide()和prevSlide(),當我上的兩個按鈕點擊被執行。 SelectedIndex在我點擊列表中的元素時起作用。我究竟做錯了什麼?我必須派遣一些活動嗎?是否有任何技巧用按鈕來做到這一點?星火列表的SelectedIndex不更新

這是我的播放列表類

public class Playlist extends List 
     { 
      private var dispatcher:Dispatcher; 

      public function Playlist() 
      { 
       super(); 

       this.dragEnabled = true; 
       this.dragMoveEnabled = true; 
       this.dropEnabled = true; 
       this.allowMultipleSelection = true; 
       this.dispatcher = new Dispatcher(); 
      } 

      public function handleSelection(event:PlaylistEvent):void 
      { 
       if (event.type == PlaylistEvent.ITEMS_SELECTED){ 
        selectItem(event.index, event.count); 
        selectedIndex = event.index; 
       } 
      } 

      private function selectItem(index:Number, count:Number):void 
      { 
       var tempArray:Array = this.dataProvider.toArray(); 
       var indiceVector:Vector.<int> = new Vector.<int>(); 
      var itemVector:Vector.<Object> = new Vector.<Object>(); 
      var n:int = 1; 
      for (var i:int=0;i<tempArray.length;i++){ 
       var item:PlaylistItem = tempArray[i]; 
       if (i<index) deselectItem(item); 
       else if (i<index+count) { 
        item.Selected=true; 
        indiceVector[count-n] = i; 
        itemVector[count-n++] = item; 

       } 
       else deselectItem(item); 
      } 
      selectedItems = itemVector; 
      selectedIndices = indiceVector; 
     } 

     private function deselectItem(item:PlaylistItem):void 
     { 
      item.Selected = false; 
     } 


     public function nextSlide():void 
     { 
      if (dataProvider.length == 0) return; 
      var index:int = selectedIndex; 

      if (index < 0) { 
       var event1:PlaylistEvent = new PlaylistEvent(PlaylistEvent.ITEMS_SELECTED, 0, 1); 
       dispatcher.dispatchEvent(event1); 
       return; 
      } 

      var item:PlaylistItem = PlaylistItem(dataProvider.getItemAt(index)); 
      if (index < dataProvider.length-1) { 
       trace("going to index", index+1); 
       var event:PlaylistEvent = new PlaylistEvent(PlaylistEvent.ITEMS_SELECTED, index+1, 1); 
       dispatcher.dispatchEvent(event); 
       return; 
      } 
     } 

     public function previousSlide():void 
     { 
      if (dataProvider.length == 0) return; 
      var index:int = selectedIndex; 
      if (index < 0) { 
       var event1:PlaylistEvent = new PlaylistEvent(PlaylistEvent.ITEMS_SELECTED, 0, 1); 
       dispatcher.dispatchEvent(event1); 
       return; 
      } 

      var item:PlaylistItem = PlaylistItem(dataProvider.getItemAt(index)); 
      if (index > 0) { 
       var event:PlaylistEvent = new PlaylistEvent(PlaylistEvent.ITEMS_SELECTED, index-1, 1); 
       dispatcher.dispatchEvent(event); 
       return; 
      } 
     } 
    } 
} 

這是我的伴侶EventMap

<?xml version="1.0" encoding="utf-8"?> 
<mate:EventMap xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:mate="http://mate.asfusion.com/" 
       xmlns:air="de.websector.mate.extensions.air.*"> 
    <fx:Script> 
     <![CDATA[ 

      import components.Playlist; 
      import events.PlaylistEvent; 
      import mx.controls.Alert; 
      import mx.events.*; 
      import mx.logging.*; 
      import mx.logging.Log; 
      import spark.components.Application; 

      private var logger:ILogger;  
      private function initLogger():void{ 
       logger = Log.getLogger("MainEventMap"); 
       trace("started init maineventmap"); 
      } 

     ]]> 
    </fx:Script> 
    <fx:Declarations> 
     <mate:EventHandlers type="{FlexEvent.APPLICATION_COMPLETE}"> 
      <mate:InlineInvoker method="initLogger"/> 
      <mate:ObjectBuilder generator="{MainManager}"/> 
      <mate:EventAnnouncer type="{InitEvent.SYSTEM_INIT_COMPLETE}" /> 
     </mate:EventHandlers> 
     <mate:Injectors target="{Playlist}"> 
      <mate:PropertyInjector targetKey="dataProvider" source="{MainManager}" sourceKey="playlistItems" /> 
     </mate:Injectors> 
     <mate:Injectors target="{MainManager}"> 
      <mate:PropertyInjector targetKey="playlist" source="{Playlist}" /> 
     </mate:Injectors> 

     <!-- Playlist events! __________________________________________________________________________________________________--> 

     <mate:EventHandlers type="{PlaylistEvent.ITEMS_SELECTED}"> 
      <mate:MethodInvoker generator="{Playlist}" method="handleSelection" arguments="{event}" /> 
     </mate:EventHandlers> 


    </fx:Declarations> 

</mate:EventMap> 
+4

你永遠設置'的selectedIndex的財產除了在公共「handleSelection」功能,這是從來沒有在內部調用。所以我們對你展示的代碼不夠了解,以幫助你。 – RIAstar

回答

1

伴侶是不能夠與它的事件總線的引用來填充您的私人調度員變量,因此事件地圖從不「聽到」你正在發送的事件,也不能調用你的方法。

這似乎是一個愚蠢的方式來調用方法相同的組件上,我認爲這是你知道你應該邏輯以某種方式分開的標誌。我建議你有一個包含dataprovider和selectedIndex的演示模型,併爲其添加引用。然後,您的列表將綁定到數據提供者和selectedIndex。 pm可以監聽總線上的事件以維護selectedIndex,或者可以直接從View組件中操作它。

這樣一來,當你意識到這是一個有點問題的,有中有按鈕的列表子類,您可以將具有列表和它的按鈕沒有任何問題的新集團的子類。

對於如何正確地注入事件總線爲例(它可以方便地演示瞭如何使用PM),退房http://www.developria.com/2010/05/refactoring-with-mate.html。看起來你對理解事件總線有了一個好的開始,但是你可能想通過查看http://www.developria.com/2010/05/pass-the-eventdispatcher-pleas.html來獲得更多的細節。

+0

該代碼已針對此問題進行了簡化,選擇過程更加複雜,並且還有更多組件,contextMenus,textField等,用於偵聽這些事件並在選擇更改時更改其外觀/內容。同樣,一旦我使用inlineinvoker,隊友調度員就像魅力一樣。 – Tore

0

正如有人指出的#Flex(IRC://irc.freenode.net/flex),因爲它構建類的新實例的錯誤是使用MethodInvoker,然後運行handleSelection方法上說實例。我通過將播放列表的實例注入EventMap並使用InlineInvoker來解決此問題。

<mate:EventHandlers type="{PlaylistEvent.ITEMS_SELECTED}"> 
     <mate:InlineInvoker method="{playlist.handleSelection}" arguments="{event}" /> 
    </mate:EventHandlers> 

所以問題在於使用配合框架,而不是Flex或數據綁定或事件dispatch。