2011-09-08 78 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。