2008-08-25 7 views

Antwort

0

Sie BindingUtils verwenden können, um benachrichtigt, wenn die dataProvider Eigentum der Änderungen Kombinationsfeld:

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

BindingUtils Leben im mx.binding.utils Paket.

Ich habe eine längere Beschreibung, wie mit BindingUtils hier arbeiten: Does painless programmatic data binding exist?

0

Sie können auch für die ResultEvent.RESULT auf der Http hören, die leicht aufgerufen werden würde, bevor das Kombinationsfeld bevölkert wurde ich denke, aber es könnte sei gut genug.

1

Sie können einen mx.binding.utils.ChangeWatcher wie beschrieben here verwenden.

+3

Der Adobe.com-Link ist beschädigt. – qualidafial

0

Wo fügen Sie den Listener im Vergleich zum Laden der Daten hinzu? Ist es möglich, dass die Daten geladen werden und das Ereignis ausgelöst wird, bevor Sie Ihren Listener hinzugefügt haben?

0

@Herms

Der Zuhörer auf jeden Fall vor dem Web-Service-Aufruf hinzugefügt wird, hier ist ein Beispiel dafür, was wie mein Code aussehen (I vereinfacht viele Dinge ...):

ich diese flex haben Komponente:

 

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!"); 
    } 
    ... 
} 
 

und dann in einer MXML-Datei habe ich die FooComboBox mit der ID "foo" und ich rufe:

 

foo.init(); 
 

Ich muss etwas Code ausführen, nachdem die Combobox ist komplett datengebunden ... irgendwelche Ideen?

0

Vielleicht wird das Ereignis nicht ausgelöst, wenn der Datenprovider zum ersten Mal gesetzt wird? Versuchen Sie, den Datenprovider auf ein leeres Array im Konstruktor zu setzen, so dass es definitiv ist, anstatt zu ändern, anstatt erst zu einem späteren Zeitpunkt in Ihrer resultRenned() - Methode zugewiesen zu werden. Ich habe keine Ahnung, ob das hilft, aber es ist einen Versuch wert.

Sie legen den Anbieter auch auf lastResult.Array.Element fest. Das erscheint mir ein wenig verdächtig, da der Datenprovider wahrscheinlich ein Array sein sollte. Zugegeben, ich habe keine Ahnung, wie Ihre Daten aussehen, also könnte das, was Sie haben, sehr wohl stimmen, aber es ist etwas, das mir aufgefallen ist, dass es verwandt sein könnte. Vielleicht sollte es nur letzterResult.Array sein?

0

Versuchen Sie in Ihrem Beispielcode validateNow() in der resultReturned Methode zu laufen. Dadurch wird das Kombinationsfeld gezwungen, seine Eigenschaften festzulegen. Die Sache ist, dass, obwohl die Eigenschaft gesetzt ist, der neue Wert nicht verwendet wird, bis commitProperties ausgeführt wird, was es frühestens auf dem nächsten Frame tun wird, zwingt validateNow() es auf einmal getan werden.

2

Flex hat keine spezifischen Datenbindungsereignisse in der Art, wie ASP .Net tut.Sie müssen auf die Eigenschaft dataProvider achten, wie John in der ersten Antwort sagt, aber nicht nur auf die Combobox oder ihre Eigenschaft dataProvider. Angenommen, Sie haben ein Setup wie dieses:

<!-- 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}"/> 

Nun, wenn Sie einen Change wie folgt festgelegt:

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

Handler wird nicht erhalten ausgelöst, wenn die Daten zurückkommt. Warum? Weil der dataProvider selbst nicht geändert wurde - seine zugrunde liegende Sammlung. Um das auszulösen, müssen Sie Folgendes tun:

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

Jetzt, wenn Ihre Sammlung aktualisiert wurde, wird Ihr Handler ausgelöst werden. Wenn Sie es mit der Strategie 1, tun möchten nicht setzen Sie Ihren DataProvider in MXML. Behandeln Sie das Ereignis collectionChange Ihrer XMLListCollection, und überschreiben Sie in AS den DataProvider der ComboBox.

Sind diese genau das gleiche wie ein datengebundenes Ereignis? Nein, aber ich habe sie benutzt und hatte nie ein Problem. Wenn Sie Ihre Daten werden absolut sicher wollen hat gebunden ist, legen sich lediglich ein Change auf dem selectedItem Eigentum Ihrer Combobox und tun es Ihre Verarbeitung. Sei einfach darauf vorbereitet, dass das Ereignis mehrmals ausgelöst wird und handle entsprechend.