2009-10-08 29 views
5

Ok, ho battuto la testa contro il muro con questo. Ho la seguente funzione impostata in Flex.La funzione Flex Set non viene chiamata

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

Se imposto periodChangeAmount su -1 o 1, viene attivato il metodo set. Se lo metto a zero non viene licenziato. Qual è l'accordo? Qualcuno sa perché non viene chiamato quando lo imposta a zero. Se cambio il tipo di oggetto in un numero o anche in un oggetto, non funziona ancora come previsto. Qualsiasi aiuto sarebbe molto apprezzato.

+0

Questo funziona bene per me. Puoi fornire il codice che stai utilizzando per testarlo? –

risposta

8

Hai inserito una traccia nel setter per assicurarti che non venga chiamato?

periodChangeAmount a Bindable proprietà lettura-scrittura? In questo caso, flex internamente chiama il getter per assicurarsi che il valore da impostare non sia il valore esistente. Se il valore corrente della proprietà (come restituito dal getter) è uguale al valore da impostare, il setter non viene chiamato.

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; 

uscita Traced:

ottenere chiamato: true
set chiamato con la vera corrente è falsa
vengono chiamati: vero

nota che il getter è stato chiamato due volte, ma la setter è stato chiamato solo una volta. Nel secondo compito, poiché il valore corrente e il valore da impostare sono uguali (true), il setter non viene chiamato.

Credo che il team di sviluppo flessibile abbia fatto in questo modo per evitare la ridondanza nell'associazione.

+0

Bummer. C'è un modo per aggirare questo se ho bisogno di lasciare l'oggetto come Bindable? – CodeMonkey

+1

È possibile inviare manualmente gli eventi di associazione dati. –

+0

controllare il valore di periodChangeAmount prima di chiamare il setter e chiamare refreshStartEndDates() esplicitamente se è lo stesso valore. – Amarghosh

1

Per risolvere il problema precedente è possibile aggiungere un evento associabile e inviare quell'evento prima di impostare le proprietà come mostrato di seguito.

private var privateVar:Boolean = false; 
[Bindable("bindableEventProperty")] 

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; 
} 

dispatchEvent(new Event("bindableEventProperty")); 
a.readWriteProp = true; 
a.readWriteProp = true; 

Questo evento si assicura che il metodo impostato della proprietà venga chiamato anche se il valore di proprietà è lo stesso.

Problemi correlati