我所拥有的是具有静态属性的类,我想将其用作图像。我希望这些图像可以在运行时配置,但仍然具有默认值。所以Images类看起来像:
package {
public class Images {
[Embed(source="/assets/Green-Light.gif")]
[Bindable]
public static var GreenLight:Class;
}
}
现在是一个自定义组件:
package {
import mx.binding.utils.BindingUtils;
import mx.controls.Image;
import spark.components.HGroup;
public class MyComp extends HGroup {
private var _image:Image;
public function MyComp() {
_image = new Image();
_image.source = Images.GreenLight;
addElement(_image);
BindingUtils.bindSetter(setImageIcon, Images, "GreenLight");
}
private function setImageIcon(newIcon:Class):void {
trace(newIcon);
_image.source = newIcon;
}
}
}
现在,如果我创建一个这样的应用程序:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
minWidth="955"
minHeight="600"
xmlns:ns1="*">
<fx:Script>
<![CDATA[
[Embed(source="/assets/Yellow-Light.gif")]
[Bindable]
public var YellowLight:Class;
]]>
</fx:Script>
<mx:Image source="{Images.GreenLight}"/>
<s:Button x="10"
y="40"
label="Button"
click="Images.GreenLight=YellowLight"/>
<ns1:MyComp x="40" y="0"/>
</s:Application>
单击该按钮会将Images类中的static属性更改为其他内容。 MXML中定义的图像将获取绑定事件并更新图像,但不会更新在ActionSctipt中创建的自定义组件。
我的问题是为什么?以及如何修复它?
谢谢!
答案 0 :(得分:1)
static
变量可以使用生成的EventDispatcher
- s和StaticPropertyWatcher
的特殊魔法进行绑定。如果您想深入了解此问题,请添加-keep
编译器选项。
这就是为什么BindingUtils.bindSetter
不起作用的原因。
不确定您是否真的想知道如何使用bindind类修复此问题:)更容易绑定到Image
实例。
答案 1 :(得分:1)
从生成的代码的外观来看,不值得试图弄清楚AS是如何做到的。在这种情况下,最好(最简单)的选项就是将Images类转换为像这样的单例:
package {
public class Images {
private static var _self:Images;
public static function getInstance():Images {
if(_self == null) {
_self = new Images();
}
return _self;
}
[Embed(source="/assets/Green-Light.gif")]
[Bindable]
public var GreenLight:Class;
}
}
MyComp类将执行绑定,如:
BindingUtils.bindSetter(setImageIcon, Images.getInstance(), "GreenLight");
感谢Maxim的建议。