2008-08-25 7 views

Répondre

0

Vous pouvez utiliser BindingUtils pour être averti lorsque la propriété dataProvider des changements de zone de liste déroulante:

BindingUtils.bindSetter(comboBoxDataProviderChanged, comboBox, "dataProvider"); 

BindingUtils vit dans le paquet mx.binding.utils.

J'ai une description plus détaillée comment travailler avec BindingUtils ici: Does painless programmatic data binding exist?

0

Vous pouvez également écouter la ResultEvent.RESULT sur le HTTPService, qui serait appelé un peu avant la zone de liste déroulante je me suis peuplé deviner, mais il pourrait sois assez bon.

1

Vous pouvez utiliser mx.binding.utils.ChangeWatcher comme décrit here.

+3

Le lien Adobe.com est rompu. – qualidafial

0

Où ajoutez-vous l'auditeur par rapport au chargement des données? Est-il possible que les données soient chargées et que l'événement soit déclenché avant que vous n'ayez ajouté votre écouteur?

0

@Herms

L'auditeur est certainement ajouté avant l'appel de service Web, voici un exemple de ce que mon regard de code comme (je simplifie beaucoup de choses ...):

J'ai ce flex composant:

 

public class FooComboBox extends ComboBox 
{ 
    private var service:HTTPService = null; 
    public function ProjectAutoComplete() 
    { 
     service = new HTTPService(); 
     service.url = Application.application.poxmlUrl; 
     service.addEventListener(FaultEvent.FAULT,serviceFault); 
     service.addEventListener(ResultEvent.RESULT,resultReturned); 


     this.addEventListener(FlexEvent.DATA_CHANGE,dataChange); 
    } 
    public function init():void 
    { 
     var postdata:Object = {}; 
     postdata["key"] = "ProjectName"; 
     postdata["accountId"] = Application.application.accountId 
     service.send(postdata); 
    } 
    private function resultReturned(event:ResultEvent):void 
    { 
     this.dataProvider = service.lastResult.Array.Element; 
     // thought I could do it here...but no luck... 
    } 
    private function dataChange(e:FlexEvent):void 
    { 
     // combobox has been databound 
     mx.controls.Alert.show("databound!"); 
    } 
    ... 
} 
 

puis dans un fichier MXML je le FooComboBox avec id "foo" et je l'appelle:

 

foo.init(); 
 

J'ai besoin d'exécuter du code après la combobox est complètement databound ... des idées?

0

Peut-être que l'événement ne se déclenche pas lorsque le fournisseur de données est défini pour la première fois? Essayez de définir le fournisseur de données sur un tableau vide dans le constructeur, afin que ce soit définitivement en changeant au lieu d'être simplement assigné initialement plus tard dans votre méthode resultReturned(). Je ne sais pas si cela va aider, mais ça vaut le coup.

De plus, vous définissez le fournisseur sur lastResult.Array.Element. Cela me semble un peu suspect, car le fournisseur de données devrait probablement être un tableau. Certes, je n'ai aucune idée de ce à quoi ressemblent vos données, alors ce que vous avez peut très bien être correct, mais c'est quelque chose que j'ai remarqué qui pourrait être lié. Peut-être que ça devrait juste être lastResult.Array?

0

Dans votre exemple de code, essayez d'exécuter validateNow() dans la méthode resultReturned. Cela forcera la zone de liste déroulante à valider ses propriétés. Le fait est que même si la propriété est définie, la nouvelle valeur n'est pas utilisée jusqu'à ce que commitProperties soit exécuté, ce qu'elle fera au plus tôt sur la trame suivante, validateNow() oblige à le faire en même temps.

2

Flex ne possède pas d'événements de liaison de données spécifiques comme le fait ASP .Net.Vous devez surveiller la propriété dataProvider comme le dit John dans la première réponse, mais pas simplement la liste déroulante ou sa propriété dataProvider. Disons que vous avez une configuration comme ceci:

<!-- Assume you have extracted an XMLList out of the result 
and attached it to the collection --> 
<mx:HttpService id="svc" result="col.source = event.result.Project"/> 
<mx:XMLListCollection id="col"/> 

<mx:ComboBox id="cbProject" dataProvider="{col}"/> 

Maintenant, si vous définissez un ChangeWatcher comme ceci:

// Strategy 1 
ChangeWatcher.watch(cbProject, "dataProvider", handler) ; 

votre gestionnaire ne pas se déclencher lorsque les données revient. Pourquoi? Parce que le dataProvider lui-même n'a pas changé - sa collection sous-jacente a fait. Pour déclencher cela, vous devez faire ceci:

// Strategy 2 
ChangeWatcher.watch(cbProject, ["dataProvider", "source"], handler) ; 

Maintenant, lorsque votre collection a été mise à jour, votre gestionnaire se déclenchera. Si vous voulez le faire fonctionner en utilisant la stratégie 1, ne pas définir votre dataProvider en MXML. Au lieu de cela, gérer l'événement collectionChange de votre XMLListCollection et dans AS, écraser le dataProvider de la zone de liste déroulante.

Est-ce exactement la même chose qu'un événement de databound? Non, mais je les ai utilisés et je n'ai jamais eu de problème. Si vous voulez être absolument sûr que vos données a lié, il suffit de mettre un changeWatcher sur la propriété selectedItem de votre liste déroulante et y faire votre traitement. Soyez simplement prêt à déclencher plusieurs fois cet événement et à le gérer de manière appropriée.

Questions connexes