看着一个可绑定的属性

时间:2009-09-08 14:15:14

标签: flex actionscript-3 mxml

在我的flex应用程序中,我有一个公共绑定属性。 我想要它,以便每次该属性的值更改时,都会触发一个函数。 我尝试使用ChangeWatchers,但似乎只适用于内置组件,如文本框更改。 我想对在运行时更改的属性执行相同的行为。

4 个答案:

答案 0 :(得分:2)

一种选择是使用BindingUtils.bindSetter(顺便返回ChangeWatcher):

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="this_creationComplete()">

    <mx:Script>
        <![CDATA[

            import mx.binding.utils.BindingUtils;
            import mx.binding.utils.ChangeWatcher;

            [Bindable]
            public var myValue:int = 0;

            private function this_creationComplete():void
            {
                var cw:ChangeWatcher = BindingUtils.bindSetter(myValueChanged, this, "myValue");
            }

            private function setValue():void
            {
                myValue = getTimer();
            }

            private function myValueChanged(o:Object):void
            {
                trace("myValue: " + myValue.toString());

                // You can also use o.toString() -- the new value will be passed into the function
            }

        ]]>
    </mx:Script>


    <mx:Button label="Click Me" click="setValue()" />

</mx:Application>

此处,只要myValueChanged属性发生更改,就会调用myValue。当然还有其他方法,但我经常使用这种方法,效果很好。希望能帮助到你!回复问题,我会留意。

答案 1 :(得分:0)

嗯,最简单的方法是监听PropertyChangeEvent.PROPERTY_CHANGE ...如果声明属性可绑定,那么mxmlc会生成调度此事件的代码...如果让编译器保留生成的ActionScript,那么你会看到它......

除此之外,你可能想看一下BindingUtils ...

答案 2 :(得分:0)

查看BindUtils类,back2dos建议。

而且,您还可以设置在对属性进行更改时将触发的事件的名称(默认为propertyChange),如下所示:

[Bindable("change")]
var myProperty : SomeClass;

即如果ChangeWatchers为change事件而不是propertyChange事件添加侦听器。对于Flex SDK的所有不幸事件,这有点奇怪,但并非不可能。

但是,我认为BindUtils课程应该为你做好准备。

答案 3 :(得分:0)

使用ObjectProxy类或其子类,并包含具有您需要观察的属性的类。在我的例子中,如果某人正在更改属性工资,并且在对象中给它一个超过55000的值,我就会调用一个函数:

包com.farata {     import mx.utils.ObjectProxy;     import flash.utils。*;

使用命名空间flash_proxy;

public dynamic class MyPersonProxy extends ObjectProxy
{
// The object to wrap up
private var person:Person;

    public function MyPersonProxy(item:Person){
        super(item);
        person=item;
    }

  flash_proxy override function setProperty(name:*, value:*):void {

if(name =='salary'&amp;&amp; value&gt; 55000){     //为此实例添加一个新属性     // class Person,可用于计算     //总薪酬                setProperty(“pension”,0.02);             } super.setProperty(name,value);
         }       }     }