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