我有一个包含一打左右字段欲结合,以形成元件,这样我可以使用该对象来将数据发送回被保存在服务器中的对象。

我的容器对象的定义:

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)将接收的改变通知并相应地更新。如果你想绑定在另一个方向走,至少有两种方法可以做到这一点:

  1. 使用MX:绑定标签直接TextInput.text回对象
  2. 使用BindingUtils要做到这一点,而不是编程。
  3. 在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}" />

像这样,也许?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top