柔性警告:无法结合属性上类的对象'“富”(类不是IEventDispatcher,请)
-
06-09-2019 - |
题
我有一个包含一打左右字段欲结合,以形成元件,这样我可以使用该对象来将数据发送回被保存在服务器中的对象。
我的容器对象的定义:
private static const emptyLink:Object = {
id: -1, title:'',
trigger1:'',trigger2:'',trigger3:'',trigger4:'',trigger5:'',
linkTitle:'', linkBody:'',
answer1:'',answer2:'',answer3:'',answer4:'',answer5:''
};
[Bindable] public var currentLink:Object = emptyLink;
currentLink
在运行时分配给特定的索引从一个ArrayCollection,我只是使用emptyLink
对象为初始化目的,大多
<mx:Panel id="triggerPanel" title="Trigger" width="33%">
<mx:VBox id="tpBoxes" width="100%" paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5">
<mx:TextInput id="trigger1" width="100%" textAlign="left" text="{currentLink.trigger1}" />
<mx:TextInput id="trigger2" width="100%" textAlign="left" text="{currentLink.trigger2}" />
<mx:TextInput id="trigger3" width="100%" textAlign="left" text="{currentLink.trigger3}" />
<mx:TextInput id="trigger4" width="100%" textAlign="left" text="{currentLink.trigger4}" />
<mx:TextInput id="trigger5" width="100%" textAlign="left" text="{currentLink.trigger5}" />
</mx:VBox>
</mx:Panel>
当然,此编译和显示得很好,但存在用于每个实例的运行时的警告:
警告:无法绑定到属性“TRIGGER1”上类“物件”(类不是IEventDispatcher,请) 警告:无法绑定到属性“触发2”阶级“对象”(类不是一个IEventDispatcher,请) 警告:无法绑定到属性“trigger3”阶级“对象”(类不是一个IEventDispatcher,请) 警告:无法绑定到属性“trigger4”阶级“对象”(类不是一个IEventDispatcher,请) 警告:无法绑定到属性“trigger5”上类“物件”(类不是IEventDispatcher,请)
和未更新currentLink
对象时TextInput
字段被改变。
显而易见的答案是,我的对象需要是实现IEventDispatcher
一个类的实例。什么这个问题的答案并没有告诉我是实现该接口的细节,如果有一个更简单的方式做到这一点(真实需要什么什么不?) - 就像一个内置的类,它会很乐意接受我的自定义属性,并允许用于结合,没有我不必担心实现该接口的细节。
这样的类是否存在?如果没有,什么是完成这个任务的最低限度和/或接受的标准?
解决方案
您需要使用ObjectProxy(作为阿赫亚提到) - 但你还需要使用valueCommit让你在输入BACK进入你的对象文本:
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
<![CDATA[
import mx.utils.ObjectProxy;
private static const emptyLink:Object = {
id: -1, title:'',
trigger1:'',trigger2:'',trigger3:'',trigger4:'',trigger5:'',
linkTitle:'', linkBody:'',
answer1:'',answer2:'',answer3:'',answer4:'',answer5:''
};
[Bindable] public var currentLink:ObjectProxy = new ObjectProxy(emptyLink);
private function handleClick():void
{
trace(currentLink.trigger1);
}
]]>
</mx:Script>
<mx:Panel id="triggerPanel" title="Trigger" width="33%">
<mx:VBox id="tpBoxes" width="100%" paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5">
<mx:TextInput id="trigger1" width="100%" textAlign="left" text="{currentLink.trigger1}" valueCommit="{currentLink.trigger1 = trigger1.text;}"/>
<mx:Button label="Click" click="handleClick()"/>
</mx:VBox>
</mx:Panel>
</mx:WindowedApplication>
其他提示
Object
不调度事件。虽然所做的变量可绑定,由可变currentLink
引用的对象的属性不能绑定。
使用ObjectProxy
代替。
[Bindable] public var currentLink:ObjectProxy = new ObjectProxy(emptyLink);
你会想知道的第一件事是,在Flex 3的结合是不是双向的。结合表达将确保,如果结合表达式(currentLink.trigger1)的源改变了目标(的TextInput)将接收的改变通知并相应地更新。如果你想绑定在另一个方向走,至少有两种方法可以做到这一点:
- 使用MX:绑定标签直接TextInput.text回对象
- 使用BindingUtils要做到这一点,而不是编程。 醇>
在Flex 4中它们被引入一个新的语法用于双向结合@ {some.binding.expression}但它Flex 3中是不可用的。
在第2部分:您收到的错误是因为你绑定到一个“通用”的原型对象。当您将[绑定]元数据标签的属性或类中,MXMLC编译器生成AS代码,包括使用结合的水电费和物业变化观察家做使绑定发生。但是你不能让原型对象做到这一点,因为它是一个内置。您可以创建自定义的ActionScript类,这是绑定(或具有某些特性可绑定)。该编译器MXMLC将产生实现IEventDispatcher的类,因此支持绑定。这具有比原型对象快的优点,并且也给你编译时检查,即如果引用一个无效的属性将收到一个编译错误。
在另一种方法是在包裹ObjectProxy原型作为其他SO成员曾建议中的一个。
这是如何找出一个较大的项目有问题的代码只是一个提示 - 把一个断点上的两个
trace("warning: unable to bind to property '"
在SDK的PropertyWatcher类线(导航>打开类型> ...)。那么堆栈跟踪将帮助您找到保存的碎绑定的UI组件。
在一般情况下,为什么你会得到“无法绑定到财产FOO一个类的原因,是因为您是丢失foo的getter或setter 。您的能也使FOO作用域到公共变量,(虽然这打破封装)
所以你需要这两个使它消失:
public function set foo (o:FooObject) : void {
...
}
或
public function get foo() : FooObject {
...
}
这里的引用LiveDocs中获得的接口。这几乎是这将是显而易见的。
要报价:
在一般情况下,一个用户定义的类,以获得事件调度能力的最简单的方法是扩展EventDispatcher。
因此,
私有静态常量emptyLink:此事件= {
我还没有被使用Flex很长时间,这可能不适合您的要求,但为什么不使用XML?我相信你可以设置的TextInput文本值属性的XML。
我使用伪代码,但这样的事情对我来说很有意义:
[Bindable] private static const currentLink:XML = <root>
<trigger1 value=""/>
<trigger2 value="" />
</root>;
...
<mx:TextInput id="trigger1" width ... text="{currentLink.trigger1.@value}" />
像这样,也许?