Tôi có một thành phần Flex 4+ tùy chỉnh mà tôi đang cố gắng thực hiện và có làn da nhận thức được những thay đổi đối với thuộc tính tùy chỉnh. Thuộc tính này sẽ xác định đồ họa trên nút (và một số thay đổi trực quan khác) nhưng dữ liệu sẽ thay đổi liên tục vì nó sẽ được cập nhật bởi bộ hẹn giờ.Flex 4 Custom Component - Làm cách nào để thông báo cho da về những thay đổi về tài sản?
Tôi đã xem các ví dụ chưa được kể và dường như không thể nhận cú pháp chính xác hoặc khám phá cách mọi thứ nên được tách riêng. Tôi đã xem xét commitProperties ghi đè và PropertyChangeEvent mà không thành công. Vì vậy, tôi có hai câu hỏi.
1) Làm cách nào để có thể nhận được thông báo về thuộc tính bị ràng buộc khi thay đổi?
2) Nếu dữ liệu cho thuộc tính bị ràng buộc của thành phần là đối tượng, sẽ ràng buộc hoạt động đúng nếu thuộc tính của đối tượng thay đổi (hoặc tốt hơn là chuyển từng thuộc tính riêng biệt)?
Dưới đây là một ví dụ được rút gọn về những gì tôi đang cố gắng đạt được.
Thành phần trông như thế này:
<s:ButtonBase xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Script>
<![CDATA[
private var _iconData:String;
[Bindable]
public function get iconData():String
{
return _iconData;
}
public function set iconData(value:String):void
{
_iconData = value;
}
]]>
</fx:Script>
Tôi gọi nó như thế này:
<components:MyButton id="myButton" iconData="{myData.curIconTag}" skinClass="skins.MyButtonSkin" />
Tôi có rất nhiều hình ảnh khác nhau tôi có thể tải và vì vậy tôi 's sợ số lượng các tiểu bang (với sự kết hợp lên/xuống/over/tàn tật, vv có thể nhận được ra khỏi tay để SetIconDisplay được thiết lập các biểu tượng, nhưng thực sự quan trọng là tôi có mã khác trong chức năng đó cần thực thi khi thuộc tính iconData thay đổi sau mỗi X phút. Vì vậy, da là một cái gì đó như thế này:
<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:fb="http://ns.adobe.com/flashbuilder/2009"
creationComplete="init()">
<fx:Metadata>
[HostComponent("components.MyButton")]
</fx:Metadata>
<s:states>
<s:State name="default" />
<s:State name="down"/>
<s:State name="up"/>
<s:State name="over"/>
<s:State name="disabled" />
</s:states>
<fx:Script>
<![CDATA[
import components.MyButton;
[Embed(source="images/image1.png")]
private var icon1:Class;
[Embed(source="images/image2.png")]
private var icon2:Class;
[Embed(source="images/image3.png")]
private var icon3:Class;
[Bindable]
public var hostComponent:MyButton;
[Bindable]
private var iconClass:Class;
private function init():void
{
iconClass = new Class();
}
// how do I get this called when the iconData property on my custom component is changed?
private function SetIconDisplay():void
{
switch (hostComponent.iconData)
{
case "apple":
iconClass=icon1;
break;
case "orange":
iconClass=icon2;
break;
case "grape":
iconClass=icon3;
break;
}
}
]]>
</fx:Script>
<s:BitmapImage source="{iconClass}" x="0" y="0" width="180" height="108"/>
Một lần nữa, đừng lo lắng nhiều về cách da được thực sự làm những gì nó đang làm như mà có lẽ sẽ thay đổi (không sử dụng tiểu bang). Tôi chỉ cố gắng tìm ra cách gọi một hàm cụ thể khi thuộc tính bị ràng buộc bị thay đổi.
Cảm ơn bạn!
Hãy nhìn vào mã SparkSkin và bạn sẽ tìm hostComponent đó không phải là một phần của SparkSkin. Tôi tin rằng tài sản được tạo ra tại thời gian biên dịch dựa trên siêu dữ liệu thành phần máy chủ lưu trữ. Điều này có ý nghĩa bởi vì tất cả các skin MXML mở rộng SparkSkin và rằng da không có cách nào để biết loại đối số bất động sản của hostComponent nên là gì. Chỉ trong một ActionScript, bạn phải tạo thuộc tính hostComponent theo cách thủ công. – JeffryHouser