2009-09-15 16 views
17

Rozważmy następujący kod:Oprawa do odczytu tylko getter w AS3

[Bindable(event="ReportHeaderVO_effectiveFromDateJulian_updated")] 
public function set effectiveFromDateJulian (value:Number) : void 
{ 
    _effectiveFromDateJulian = value; 
    dispatchEvent(new FlexEvent("ReportHeaderVO_effectiveFromDateJulian_updated")); 
} 

public function get effectiveFromDateJulian() : Number 
{ 
    return _effectiveFromDateJulian; 
} 

public function get effectiveFromDate() : Date 
{ 
    return DateUtil.convertJDEJulianToDate(_effectiveFromDateJulian); 
} 

Jest setter i getter dla effectiveFromDateJulian który jest reprezentacją liczby dzień. Dostarczyłem oddzielny program pobierający, który pobiera tę samą wartość, tylko przekształca się w prawidłową datę. Jest to getter tylko i opiera się na ustawiaczu dla właściwości liczbowej, aby uzyskać jego dane; więc efektywna właściwośćFromDate jest efektywnie tylko do odczytu.

Powiązanie danych działa na zasadzie effectiveFromDateJulian; wszelkie aktualizacje działają poprawnie i powiadamiają o tym wszystko poprawnie. Ale gdy wiązanie z effectiveFromDate (getter tylko) nieruchomości, pojawia się ostrzeżenie kompilatora:

warning: unable to bind to property 'effectiveToDate' on class 'com.vo::ReportHeaderVO' 

Czy istnieje sposób, aby umożliwić wiązanie do tego obiektu tylko do odczytu? Zakładam, że będę musiał wysłać wydarzenie na setera, który wpływa na właściwość tylko do odczytu, ale nie wiem, jak by to wyglądało.

Jest to prosty przykład, można sobie wyobrazić właściwość tylko do odczytu, która zależy od kilku ustawiaczy do działania, a gdy którykolwiek z tych ustawiających jest aktualizowany, właściwość tylko do odczytu wymagałaby również wywołania zdarzenia propertyChanged. Jakieś pomysły? Daj mi znać, jeśli muszę coś wyjaśnić.

Aktualizacja: Z dokumentacji Adobe tutaj:

http://livedocs.adobe.com/flex/3/html/help.html?content=databinding_8.html

Korzystanie tylko do odczytu właściwości jako źródła dla danych wiązania

można automatycznie stosować tylko do odczytu własność zdefiniowane przez metodę gettera, , co oznacza brak metody ustawiającej, jako źródło dla wyrażenia wiążącego dane. Flex wykonuje wiązanie danych po po uruchomieniu aplikacji.

ponieważ wiązanie z właściwości tylko do odczytu danych odbywa się tylko raz w aplikacji uruchomić, pominąć [Bindable] znacznik metadanych na tylko do odczytu właściwości .

To ma sens dla stałych wartości, ale w tym przypadku wartość się zmienia, po prostu nie jest ustawiana bezpośrednio.

Odpowiedz

16

Wykonaj readterly getter Bindable i wyślij odpowiednie zdarzenie z oryginalnej metody ustawiacza.

[Bindable(event="ReportHeaderVO_effectiveFromDateJulian_updated")] 
public function set effectiveFromDateJulian (value:Number) : void 
{ 
    _effectiveFromDateJulian = value; 
    dispatchEvent(new FlexEvent("ReportHeaderVO_effectiveFromDateJulian_updated")); 
    dispatchEvent(new FlexEvent("ReportHeaderVO_effectiveFromDate_updated")); 
} 
[Bindable(event="ReportHeaderVO_effectiveFromDate_updated")] 
public function get effectiveFromDate (date:Date) : Date 
{ 
    return DateUtil.convertJDEJulianToDate(_effectiveFromDateJulian); 
} 
+0

To było idealne, dokładnie to, czego szukałem. Po spojrzeniu na to, ma on całkowitą sensację co do tego, jak i dlaczego działa, ale nadal nie jest jasne w dokumentach, że tak właśnie powinno być. Więc kiedy umieścisz metadane [Bindable (event)], nawet jeśli dokumenty pokazują, że są umieszczane na seterze, to właśnie jest po prostu umieszczane na nieruchomości (publicznie eksponowana właściwość). Równie łatwo można go umieścić na geterze i działa tak samo. Po prostu z ciekawości, czy masz jakiś link do dokumentacji lub gdziekolwiek indziej, który pokazuje, że robi to w ten sposób? Jeszcze raz dziękuję! To bardzo pomogło. –

+2

http://livedocs.adobe.com/flex/3/html/help.html?content=databinding_2.html # 190306 mówi, że "Jeśli podasz nazwę zdarzenia, to jesteś odpowiedzialny za wysłanie zdarzenia po zmianie właściwości źródła." Po prostu spróbowałem i zadziałało. Googling zaprowadził mnie na http://www.deitte.com/archives/2009/04/bindable_getter.htm i http://joshblog.net/2009/07/15/flex-readonly-bindable-getter-ignored-warning- wyjaśnił/ – Amarghosh

+1

I tak, nie ma znaczenia, gdzie umieścić znacznik [Bindable] (getter lub setter), które ma zastosowanie do nieruchomości. Chociaż dla celów asdoc, dobrze jest umieścić go na setera. – Amarghosh