2009-10-08 22 views
5

Dobra, waliłem głową w ścianę tym razem. Mam funkcję zestawu w Flex.Funkcja zestawu Flex nie nazywa się

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

Jeśli ustawię periodChangeAmount na -1 lub 1, ustawiona metoda zostanie uruchomiona. Jeśli ustawię go na zero, to nie zostanie wystrzelony. O co chodzi? Czy ktoś wie, dlaczego nie został wywołany, gdy ustawienie go na zero. Jeśli zmienię typ obiektu na liczbę lub nawet obiekt, to nadal nie działa zgodnie z oczekiwaniami. Każda pomoc będzie wielce ceniona.

+0

To działa dobrze dla mnie. Czy możesz podać kod, którego używasz do testowania tego? –

Odpowiedz

8

położyłeś ślad w seter aby upewnić się, że nie nazywa?

Czy periodChangeAmountBindable odczytu i zapisu nieruchomość? W takim przypadku flex wewnętrznie wywołuje getter, aby upewnić się, że ustawiana wartość nie jest wartością istniejącą. Jeśli bieżąca wartość właściwości (zwrócona przez moduł pobierający) jest taka sama jak wartość do ustawienia, program ustawiający nie jest wywoływany.

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; 

Traced wyjściowa:

się nazywa: false
zestaw sprawdził z prawdziwego prądu jest fałszywa
się nazywa: true

Zauważ, że getter nazwano dwa razy, ale seter został wywołany tylko raz. W drugim zadaniu, ponieważ bieżąca wartość i wartość, które mają być ustawione, są takie same (true), setter nie jest wywoływany.

wierzę Flex dev team zrobił to w ten sposób, aby uniknąć zwolnień w wiązaniu.

+0

Bummer. Czy jest jakiś sposób obejścia tego, jeśli muszę zostawić obiekt jako Bindable? – CodeMonkey

+1

Możesz ręcznie wywołać zdarzenia powiązania danych. –

+0

sprawdź wartość periodChangeAmount przed wywołaniem settera i jawnie wywołaj refreshStartEndDates(), jeśli ma tę samą wartość. – Amarghosh

1

W celu rozwiązania powyższego problemu można dodać Bindable wydarzenie i wysyłka tego zdarzenia przed ustawieniem żadnych właściwości, jak pokazano poniżej.

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; 

To wydarzenie zapewnia wywołanie metody set właściwości, nawet jeśli wartość właściwości jest taka sama.

Powiązane problemy