Flex警告:无法绑定到类'Object'上的属性'foo'(类不是IEventDispatcher)

Ada*_*tle 24 apache-flex binding mxml flex3 actionscript-3

我有一个对象,其中包含我想要绑定到表单元素的十几个字段,以便我可以使用该对象将数据发送回服务器进行保存.

我的容器对象的定义:

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;
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

当然,这编译并显示得很好,但每个实例都有运行时警告:

警告:无法绑定到类'Object'上的属性'trigger1'(类不是IEventDispatcher)警告:无法绑定到类'Object'上的属性'trigger2'(类不是IEventDispatcher)警告:无法绑定到类'Object'上的属性'trigger3'(类不是IEventDispatcher)警告:无法绑定到类'Object'上的属性'trigger4'(类不是IEventDispatcher)警告:无法在类上绑定属性'trigger5' '对象'(类不是IEventDispatcher)

并且在更改字段currentLink时不更新对象TextInput.

显而易见的答案是我的对象需要是实现的类的实例IEventDispatcher.答案没有告诉我的是实现该界面的细节(需要什么?什么不是?),以及是否有更简单的方法 - 比如内置类,它会很乐意接受我的自定义属性并允许对于绑定,我不必担心实现接口的细节.

这样的课程存在吗?如果没有,完成此任务的最低和/或接受标准是什么?

Gab*_*iel 16

您需要使用ObjectProxy(如Chetan提到的那样) - 但您还需要使用valueCommit将输入的文本返回到对象中:

<?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>
Run Code Online (Sandbox Code Playgroud)


Che*_*try 9

Object不派遣事件.虽然您已经创建了变量Bindable,但是currentLink不能绑定变量引用的对象的属性.

ObjectProxy改用.

[Bindable] public var currentLink:ObjectProxy = new ObjectProxy(emptyLink);
Run Code Online (Sandbox Code Playgroud)


cli*_*ers 5

您首先要了解的是,Flex 3中的绑定不是双向的。绑定表达式将确保如果绑定表达式的源(currentLink.trigger1)发生更改,则目标(TextInput)将收到更改通知并进行相应更新。如果您希望绑定朝另一个方向前进,则至少有两种方法可以执行此操作:

  1. 使用mx:Binding标记将TextInput.text定向回该对象
  2. 使用BindingUtils以编程方式执行此操作。

在Flex 4中,他们引入了用于双向绑定@ {some.binding.expression}的新语法,但在Flex 3中不可用。

在第二部分:您收到的错误是因为您绑定到“通用”原型对象。将[Bindable]元数据标签应用于属性或类时,MXMLC编译器会生成AS代码,其中包括使用绑定实用程序和属性更改观察程序来进行绑定。但是,由于它是内置对象,因此无法使原型对象执行此操作。您可以创建一个可绑定(或具有某些可绑定属性)的自定义ActionScript类。MXMLC编译器将生成一个实现IEventDispatcher的类,因此支持绑定。这具有比原型对象更快的优点,并且还提供了编译时检查,即,如果引用无效的属性,则会收到编译器错误。

另一种选择是按照其他SO成员之一的建议将原型包装在ObjectProxy中。