Flex设置函数未被调用。

5

好的,这个问题让我头疼了很久。以下是我在Flex中编写的设置函数。

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

如果我将periodChangeAmount设置为-1或1,则set方法会被触发。如果我将其设置为零,则不会被触发。这是怎么回事?有人知道为什么将其设置为零时不会被调用吗?如果我将对象类型更改为数字甚至对象,它仍然无法按预期工作。非常感谢任何帮助。


这对我来说很好用。你能提供一下你用来测试的代码吗? - James Ward
2个回答

8

你是否在setter中设置了追踪器以确保它没有被调用?

periodChangeAmount是一个可绑定的读写属性吗?如果是的话,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;

跟踪输出:

被调用: false
带有true的设置被调用,当前为false
被调用: true

请注意,getter被调用了两次,但setter只被调用了一次。在第二次赋值中,由于当前值和要设置的值相同(true),因此不会调用setter。

我相信Flex开发团队这样做是为了避免绑定中的冗余。


糟糕。如果我需要将对象保留为Bindable,有没有任何解决方法? - CodeMonkey
在调用setter之前检查periodChangeAmount的值,如果它是相同的值,则显式调用refreshStartEndDates()。 - Amarghosh

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方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接