2011-12-19 2 views
0

У меня есть компонент A в моем проекте flex, где люди могут голосовать за своего любимого исполнителя. Кто-то «любит» художника, он обновляется в моей базе данных. Существует также компонент B, который показывает диаграмму самых любимых артистов. Я вызываю данные из базы данных при создании complete в Flex. Проблема в том, что когда человек сначала голосует за исполнителя, он не будет виден в datagrid, пока пользователь не перезагрузит главную страницу (?) Или не откроет все приложение. Поэтому мне было интересно, как я могу обновлять datagrid каждый раз, когда кто-то добавляет голосование в мою базу данных. Теперь я использую кнопку обновления, но это не очень удобно для пользователей. Любая помощь приветствуется!Flex: обновлять datagrid каждый раз, когда добавляется значение (из другого компонента)

ответ

1

Использование ArrayCollection, вы просто сделать это Привязываемым весь путь через все компоненты

<fx:Script> 
    <![CDATA[ 
     import mx.collections.ArrayCollection; 
     import mx.events.FlexEvent; 

     [Bindable] 
     public var artistData:ArrayCollection = new ArrayCollection([ 
      {artistName : "Paula", artistLikes : "0"}, 
      {artistName : "Bob", artistLikes : "0"}, 
      {artistName : "Arthur", artistLikes : "0"} 
     ]); 

    ]]> 
</fx:Script> 

<s:layout> 
    <s:VerticalLayout/> 
</s:layout> 

<s:DataGrid id="artists" dataProvider="{artistData}" width="100%" height="150"> 
    <s:columns> 
     <s:ArrayList> 
      <s:GridColumn dataField="artistName" headerText="Artist Name"/> 
      <s:GridColumn dataField="artistLikes" headerText="Artist Likes"/> 
     </s:ArrayList> 
    </s:columns> 
</s:DataGrid> 

<components:CompA artistDataInCompA="{artistData}" height="100"/> 

<components:CompB artistDataInCompB="{artistData}" height="100"/> 

Предположим, вы увеличиваете количество понравившихся вам в com р A (Не забудьте вызвать обновление() на ArrayCollection)

<fx:Script> 
    <![CDATA[ 
     import mx.collections.ArrayCollection; 

     [Bindable] 
     public var artistDataInCompA:ArrayCollection; 

     protected function button_clickHandler(name:String):void 
     { 
      var index:Number = getItemIndexByProperty(artistDataInCompA, "artistName", name); 
      var numLikes:Number = artistDataInCompA[index].artistLikes; 
      // Here you update your PHP 
      // HTTPService... 

      // and the ArrayCollection that is binded all the way through all components 
      artistDataInCompA[index].artistLikes = numLikes + 1; 
      artistDataInCompA.refresh(); 
     } 

     protected function getItemIndexByProperty(array:ArrayCollection, property:String, value:String):Number 
     { 
      for (var i:Number = 0; i < array.length; i++) 
      { 
       var obj:Object = Object(array[i]) 
       if (obj[property] == value) 
        return i; 
      } 
      return -1; 
     } 

    ]]> 
</fx:Script> 

<s:layout> 
    <s:VerticalLayout/> 
</s:layout> 

<s:Button label="Add a like to Paula" click="button_clickHandler('Paula')"/> 

<s:Button label="Add a like to Bob" click="button_clickHandler('Bob')"/> 

<s:Button label="Add a like to Arthur" click="button_clickHandler('Arthur')"/> 

А теперь делать то, что вы должны сделать в вашей компании B

<fx:Script> 
    <![CDATA[ 
     import mx.collections.ArrayCollection; 

     [Bindable] 
     public var artistDataInCompB:ArrayCollection; 

    ]]> 
</fx:Script> 

<s:layout> 
    <s:VerticalLayout/> 
</s:layout> 

<s:Label text="Paula has {artistDataInCompB.getItemAt(0).artistLikes} like(s)"/> 

<s:Label text="Bob has {artistDataInCompB.getItemAt(1).artistLikes} like(s)"/> 

<s:Label text="Arthur has {artistDataInCompB.getItemAt(2).artistLikes} like(s)"/> 

+0

Wondefull! спасибо :) –

+0

+1 для обхода проблемы ... но вы должны разрешить айерам самим работать и понимать. Я думаю, что просто обеспечить логику достаточно :) –

0

Если вы хотите медленный отклик, вы должны добавить коммуникационную способность к вашему сценарию сценария действия с помощью серверной скриптовой системы, такой как PHP. Если вам нужен ответ в реальном времени, вы должны использовать службу сокетов или веб-службу.

1

Каждый раз, когда вы голосуете, добавьте эти строки в функцию после того, как вы отправите команду, чтобы добавить еще один голос.

public function voteUpFunction():void 
{ 
    // Your Code to Vote up <Enter Code here> 
    YourDataGridId.dataprovider = null; 
    //call new listofLikedPersons using conn.call <Enter Code here> 
    YourDataGridId.dataprovider = listOfLikedPersons; 
} 

Надеется, что это помогает, скажи мне, если это решает проблему

0

его простой, вам просто нужно поддерживать одну переменную таймера, и в какой-то момент пусть займет 1 секунду, вам просто нужно обновить dataprovider datagrid.

Желаем приятного дня.

Смежные вопросы