2009-09-15 26 views
17

Xét đoạn mã sau:Ràng buộc để một getter chỉ đọc trong 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); 
} 

Có một setter và getter cho effectiveFromDateJulian mà là một đại diện số ngày. Tôi đã cung cấp một getter riêng biệt mà lấy cùng một giá trị, chỉ được chuyển đổi thành một ngày thích hợp. Nó là một getter chỉ mặc dù và dựa vào setter cho thuộc tính số để lấy dữ liệu của nó; do đó thuộc tính effectiveFromDate có hiệu quả chỉ đọc.

Ràng buộc dữ liệu hoạt động trên thuộc tính effectiveFromDateJulian; mọi cập nhật đều hoạt động tốt và thông báo mọi thứ đúng cách. Nhưng khi gắn vào effectiveFromDate (getter chỉ) bất động sản, tôi nhận được một cảnh báo từ trình biên dịch:

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

Có cách nào để làm cho nó có thể để ràng buộc vào bất động sản read-only này? Tôi cho rằng tôi sẽ phải gửi một sự kiện trên setter có hiệu lực với thuộc tính chỉ đọc, nhưng tôi không biết nó sẽ như thế nào. Đây là một ví dụ đơn giản, bạn có thể tưởng tượng một thuộc tính chỉ đọc phụ thuộc vào một số trình cài đặt hoạt động và khi bất kỳ bộ định cư nào được cập nhật, thuộc tính chỉ đọc cũng cần phải kích hoạt một sự kiện propertyChanged. Bất kỳ ý tưởng? Xin vui lòng cho tôi biết nếu tôi cần phải làm rõ bất cứ điều gì.

Cập nhật: Từ các tài liệu Adobe đây:

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

Sử dụng chỉ đọc tài sản như nguồn cho dữ liệu ràng buộc

Bạn có thể tự động sử dụng một chỉ đọc bất động sản được xác định bằng phương thức getter, có nghĩa là không có phương thức setter, như là nguồn cho một biểu thức ràng buộc dữ liệu. Flex thực hiện ràng buộc dữ liệu một lần khi ứng dụng bắt đầu.

Bởi vì dữ liệu ràng buộc từ một tài sản read-only chỉ xảy ra một lần tại ứng dụng khởi động, bạn bỏ qua các [Bindable] thẻ siêu dữ liệu cho tài sản read-only.

Và điều này có ý nghĩa đối với các giá trị không đổi, nhưng trong trường hợp này giá trị thay đổi, nó không được đặt trực tiếp.

Trả lời

16

Làm cho trình rút gọn chỉ đọc Bindable và gửi sự kiện tương ứng từ phương thức setter gốc.

[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

Điều này hoàn hảo, chính xác những gì tôi đang tìm kiếm. Sau khi nhìn vào nó, nó làm cho ý nghĩa tổng thể về cách thức và lý do tại sao nó hoạt động, nhưng nó vẫn không rõ ràng trong các tài liệu rằng đây là cách nó nên được. Vì vậy, khi bạn đặt siêu dữ liệu [Bindable (event)], mặc dù các tài liệu hiển thị nó được đặt trên setter, nó thực sự chỉ được đưa vào thuộc tính (thuộc tính công khai). Nó chỉ có thể dễ dàng được đặt trên getter và nó hoạt động như nhau. Chỉ vì tò mò, bạn có bất kỳ liên kết nào đến tài liệu hoặc bất kỳ nơi nào khác hiển thị để làm điều đó như thế này không? Cảm ơn bạn lần nữa! Điều này đã giúp rất nhiều. –

+2

http://livedocs.adobe.com/flex/3/html/help.html?content=databinding_2.html # 190306 nói rằng "Nếu bạn chỉ định tên sự kiện, bạn có trách nhiệm gửi sự kiện khi thuộc tính nguồn thay đổi". Tôi chỉ thử nó và nó đã hoạt động. Googling đã đưa tôi đến http://www.deitte.com/archives/2009/04/bindable_getter.htm và http://joshblog.net/2009/07/15/flex-readonly-bindable-getter-ignored-warning- giải thích/ – Amarghosh

+1

Và vâng, nó không quan trọng nơi bạn đặt thẻ [Bindable] (getter hoặc setter) nó áp dụng cho thuộc tính. Mặc dù cho các mục đích của asdoc, tốt của nó để đặt nó trên setter. – Amarghosh

Các vấn đề liên quan