解决Flex4双向绑定因数据类型不同而出现编译错误问题

以下内容转载自

http://www.iyoya.com/2011/06/24/two-way-data-binding-problem.html

正文:

在flex4以前如果要实现双向数据绑定就必须为数据源和目录对象进行交互绑定,而flex4后实现了双向数据绑定新的快速方法,如下所示:

1、组件中绑定

<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" >
      <s:TextInput id="t1" text="@{t2.text}"/>
      <s:TextInput id="t2"/>
  </s:Application>

2、fx:Binding标签

<fx:Binding source="t1.text" destination="t2.text" twoWay="true"/> 

但是这个新的方法对于数据源与目标对象具有不同的类型的情况时会产生一个问题,即反向绑定中目标对象的值将无法正确的绑定到数据源对象中,如下面例子所示:

<?xml version="1.0"?>
<!-- binding/E4XInBindingTag.mxml -->
<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"
               width="600" height="400">
    <fx:Script>
        <![CDATA[
            [Bindable]
            private var age:Number = 0;
        ]]>
    </fx:Script>
    <s:TextInput id="t1" text="@{age}"/>
</s:Application>

上面的双向绑定的例子中存在一个错误:“类型1067: String类型值的隐式强制指令的目标是非相关类型 Number”。目标对象的值无法正确的绑定到数据源对象中。
对于这个问题之前已经有人在Adobe的官网上提出过(见: http://opensource.adobe.com/wiki/display/flexsdk/Two-way+Data+Binding ),看来这确实是一个问题。在回复中有两个人的方案可以解决这个问题,一种是通过重写数据绑定的组件类,另一种是通过事件自己更新值。第一种方法工作量较大,第二种方法看上去好象脱离主题了但实现确很灵活。下面为第二种方法实现的例子:

<?xml version="1.0"?>
<!-- binding/E4XInBindingTag.mxml -->
<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"
               width="600" height="400">
    <fx:Script>
        <![CDATA[
            [Bindable]
            private var age:Number = 0;
        ]]>
    </fx:Script>
    <s:VGroup>
        <s:HGroup verticalAlign="middle">
            <s:Label text="Change Age Value"/>
            <s:NumericStepper maximum="100" id="ns" change="age=ns.value"/>
        </s:HGroup>
        <s:HGroup verticalAlign="middle">
            <s:Label text="Two Way Binding Age Value"/>
            <s:TextInput id="t1" text="{age}" change="age = Number(t1.text)"/>
        </s:HGroup>
        <s:HGroup verticalAlign="middle">
            <s:Button label="Output Current Age Value" click="{t2.text=String(age)}"/>
            <s:TextInput id="t2"/>
        </s:HGroup>
    </s:VGroup>
</s:Application>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值