Flex: comunicare tra la pelle e il modello di dati?
-
27-10-2019 - |
Domanda
Come inviare alla skin un valore che è cambiato?
Soluzione
Ci sono due approcci a questo: uno utilizza l'associazione ed è più semplice, l'altro è più complesso ma migliore per le prestazioni.
Utilizzo dell'associazione
Supponi che la tua classe di visualizzazione sia simile a questa:
public class MyClass extends SkinnableComponent {
[Bindable] public var myValue:String;
}
quindi puoi legarti a quel valore nella tua pelle in questo modo:
<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark">
<fx:Metadata>
[HostComponent("MyClass")]
</fx:Metadata>
<s:Label id="myLabel" text="{hostComponent.myValue}" />
</s:Skin>
Sostituzione di commitProperties
Supponiamo che lo stesso skin senza binding, quindi puoi impostare la proprietà text dell'etichetta utilizzando uno skinpart e sovrascrivendo commitProperties nel componente host. Il nome dello skinpart deve essere esattamente lo stesso dell'ID del componente nello skin (in questo caso "myLabel").
public class MyClass extends SkinnableComponent {
[SkinPart(required="true")]
public var myLabel:Label;
public var myValue:String;
override protected function commitProperties():void {
if (myLabel) myLabel.text = myValue;
super.commitProperties();
}
}
Ovviamente dovresti chiamare invalidateProperties()
ogni volta che vuoi applicare il nuovo valore (ad esempio in una funzione setter per 'myLabel'). Nota inoltre che "myLabel" non deve più essere associabile, a meno che tu non voglia essere in grado di collegarlo esternamente.
modifica: quale approccio scegliere?
Ho appena risposto a una domanda che è strettamente correlata a questa in cui elaboro i pro ei contro di ciascun approccio in diverse situazioni. Puoi trovarlo qui: Flex: etichetta aggiuntiva in ButtonBarButton