我正在重写纯AS中的MXML项目渲染器。我似乎无法解决的一个问题是如何让每个项目渲染器对项目渲染器类上的静态属性的更改做出反应。在MXML版本中,我在项呈示器上设置了以下绑定:
instanceProperty={callInstanceFunction(ItemRenderer.staticProperty)}
在AS中设置它的等效方法是什么(我假设使用BindingUtils)?
更新
所以我认为以下内容不起作用,但似乎Flex正在抑制在instanceFunction中抛出的错误,使得它看起来好像绑定本身是坏的。
BindingUtils.bindSetter(instanceFunction, ItemRenderer, "staticProperty");
但是,当调用instanceFunction时,给定实例上已经初始化的变量都是null,这是上面引用的错误的原因。任何想法为什么会这样?
答案 0 :(得分:2)
您有两个我知道的选项:
选项1 您可以深入研究Flex编译器基于MXML构建的代码,以了解它如何处理与静态属性的绑定。有一个名为-keep-generated-actionscript的编译器指令会导致生成的文件停留。通过这些调查可以让您了解会发生什么。此选项将涉及实例化Binding对象和StaticPropertyWatcher对象。
选项2 有一些staticEventDispatcher对象在构建时添加到包含静态变量的类中,请参阅此帖子http://thecomcor.blogspot.com/2008/07/adobe-flex-undocumented-buildin.html。根据帖子,这个对象只是根据静态变量的存在而不是getter函数来添加。
选项2的示例 假设我们有一个名为 MyClassContainingStaticVariable 的类,其中包含一个名为 MyStaticVariable 的静态变量,另一个变量someobject.somearrayproperty,我们希望在MyStaticVariable发生变化时更新。
Class(MyClassContainingStaticVariable).staticEventDispatcher.addEventListener(
PropertyChangeEvent.PROPERTY_CHANGE,
function(event:PropertyChangeEvent):void
{
if(event.property == "MyStaticVariable")
{
someobject.somearrayproperty = event.newValue as Array;
}
});
答案 1 :(得分:0)
我认为你需要回应“PropertyChanged”事件。
答案 2 :(得分:0)
如果您要这样做,请使用单例而不是静态。我认为它不会起作用。 (如果你必须这样做,可能有几种方法你可以重新认识这会更好)。
var instance:ItemRenderer = ItemRenderer.getInstance();
BindingUtils.bindProperty(this, "myProperty", instance, "theirProperty");
答案 3 :(得分:0)
在摆弄了一段时间之后,我得出结论,目前这在ActionScript中是不可能的,即使使用bindSetter也是如此。似乎有一些仅限MXML的数据绑定功能,可以从Adobe docs的以下摘录中判断出来(虽然不是所有都编译成AS代码)?
您不能包含函数或数组 数据中属性链中的元素 绑定表达式由 bindProperty()或bindSetter()方法。 有关财产的更多信息 链,请参阅使用可绑定 产权链。
来源:http://livedocs.adobe.com/flex/3/html/help.html?content=databinding_7.html
答案 4 :(得分:0)
您可以创建一个HostProxy类来代替funciton调用。类似于从代理扩展的HostFunctionProxy类,并且具有getProperty("functionInvokeStringWithParameters")
,它将从主机远程调用该函数,并调度“change”事件以触发典型的[Bindable("change")]
Proxy类中的绑定。
您可以让HostProxy类充当主机,并使用该属性远程触发函数调用。当然,让一些TypeHelperUtil
允许在运行时将原始字符串值转换为序列化类型值(对于方法参数)(通常用逗号分割)会更酷。
实施例: 例如
var standInHost:Object = new HostFunctionProxy(someModelClassWithMethod, "theMethodToCall(20,11)");
// With BindingUtils.....
// bind host: standInHost
// bind property: "theMethodToCall(20,11)"
当然,您需要创建这样的能力来帮助支持除基本Flex处方之外的此类功能。似乎许多这样的(更高级的)Flex绑定通常在编译时完成,但现在您必须创建代码以在完全跨平台的Actionscript方式下在运行时执行此操作,而不依赖于Flex框架。