2009-10-08 6 views
5

Bon, je me suis cogné la tête contre le mur avec celui-ci. J'ai la fonction set suivante dans Flex.La fonction Flex Set n'est pas appelée

public function set periodChangeAmount(value:int):void 
    { 
     _PeriodChangeAmount = value; 
     refreshStartEndDates(); 
    } 

Si je mets le paramètre periodChangeAmount à -1 ou 1, la méthode set est déclenchée. Si je le mets à zéro, il ne sera pas viré. Quel est le problème? Est-ce que quelqu'un sait pourquoi il ne serait pas appelé lors de la mise à zéro. Si je change le type d'objet en nombre ou même en objet, cela ne fonctionne toujours pas comme prévu. Toute aide serait grandement appréciée.

+0

Cela fonctionne très bien pour moi. Pouvez-vous fournir le code que vous utilisez pour tester cela? –

Répondre

8

Avez-vous placé une trace dans le setter pour vous assurer qu'il n'est pas appelé?

Est periodChangeAmount une propriété en lecture-écriture? Dans ce cas, Flex appelle en interne le getter pour s'assurer que la valeur à définir n'est pas la valeur existante. Si la valeur actuelle de la propriété (renvoyée par le getter) est la même que la valeur à définir, le setter n'est pas appelé.

private var privateVar:Boolean = false; 

[Bindable] 
public function set readWriteProp(value:Boolean):void 
{ 
    trace("set called with " + value + " current is " + privateVar); 
    privateVar = value; 
} 
public function get readWriteProp():Boolean 
{ 
    trace("get called : " + privateVar); 
    return privateVar; 
} 
//... 
a.readWriteProp = true; 
a.readWriteProp = true; 

sortie Tracée:

se dit: false
ensemble appelé à vrai courant est faux
nous appelle: true

Notez que le getter a été appelé deux fois, mais la Le setter n'a été appelé qu'une seule fois. Dans la deuxième affectation, puisque la valeur courante et la valeur à définir sont identiques (vrai), le setter n'est pas appelé. Je pense que flex dev team l'a fait de cette façon pour éviter la redondance dans la liaison.

+0

Bummer. Y at-il un moyen de contourner ce problème si je dois laisser l'objet en tant que Bindable? – CodeMonkey

+1

Vous pouvez répartir les événements de liaison de données manuellement. –

+0

Vérifiez la valeur de periodChangeAmount avant d'appeler le setter et appelez refreshStartEndDates() explicitement s'il s'agit de la même valeur. – Amarghosh

1

Afin de résoudre le problème ci-dessus, vous pouvez ajouter un événement liable et répartir cet événement avant de définir les propriétés comme indiqué ci-dessous. Cet événement vérifie que la méthode set de la propriété est appelée même si la valeur de la propriété est la même.

Questions connexes