2009-10-08 47 views
5

好吧,我一直在用这个撞墙来敲我的头。我在Flex中有以下设置功能。Flex设置功能没有被调用

public function set periodChangeAmount(value:int):void 
    { 
     _PeriodChangeAmount = value; 
     refreshStartEndDates(); 
    } 

如果我设置periodChangeAmount为-1​​或1 set方法被炒鱿鱼。如果我将它设置为零,它不会被解雇。这是怎么回事?有谁知道为什么它不会被调用时,将其设置为零。如果我将对象类型更改为数字或对象,它仍然不能按预期工作。任何帮助将不胜感激。

+0

这对我来说很好。你能提供你用来测试的代码吗? – 2009-10-08 16:34:51

回答

8

你是否在追溯器中添加了一条痕迹以确保它不被调用?

periodChangeAmount a Bindable读写属性?在这种情况下,flex在内部调用getter以确保要设置的值不是现有值。如果属性的当前值(由getter返回)与要设置的值相同,则不调用setter。

private var privateVar:Boolean = false; 

[Bindable] 
public function set readWriteProp(value:Boolean):void 
{ 
    trace("set called with " + value + " current is " + privateVar); 
    privateVar = value; 
} 
public function get readWriteProp():Boolean 
{ 
    trace("get called : " + privateVar); 
    return privateVar; 
} 
//... 
a.readWriteProp = true; 
a.readWriteProp = true; 

追述输出:

得到所谓:假
集调用真正的电流是假
得到所谓:真

注意,吸气剂叫了两声,但二传手只被召唤一次。在第二个作业中,由于要设置的当前值和值相同(true),因此不会调用setter。

我相信flex dev团队这样做是为了避免冗余绑定。

+0

无赖。如果我需要将对象作为Bindable离开,是否有解决方法? – CodeMonkey 2009-10-08 17:08:11

+1

您可以手动调度数据绑定事件。 – 2009-10-08 17:11:33

+0

在调用setter之前检查periodChangeAmount的值,如果值相同,则显式调用refreshStartEndDates()。 – Amarghosh 2009-10-09 04:09:39

1

为了解决上述问题,您可以在设置任何属性之前添加可绑定事件并分派该事件,如下所示。

private var privateVar:Boolean = false; 
[Bindable("bindableEventProperty")] 

public function set readWriteProp(value:Boolean):void 
{  
    trace("set called with " + value + " current is " + privateVar); 
    privateVar = value; 
} 
public function get readWriteProp():Boolean 
{ 
    trace("get called : " + privateVar);  
    return privateVar; 
} 

dispatchEvent(new Event("bindableEventProperty")); 
a.readWriteProp = true; 
a.readWriteProp = true; 

此事件确保即使属性值相同,也调用该属性的set方法。