【问题标题】:Flex set function not getting calledFlex set 函数没有被调用
【发布时间】:2009-10-08 16:24:46
【问题描述】:

好的,我一直用这个把头撞到墙上。我在 Flex 中有以下设置功能。

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

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

【问题讨论】:

  • 这对我来说很好用。你能提供你用来测试这个的代码吗?

标签: apache-flex


【解决方案1】:

您是否在 setter 中放置了跟踪以确保它没有被调用?

periodChangeAmountBindable 读写属性吗?在这种情况下,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 调用的集合当前为 false
被调用:真

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

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

【讨论】:

  • 无赖。如果我需要将对象保留为 Bindable,有什么办法可以解决这个问题?
  • 在调用 setter 之前检查 periodChangeAmount 的值,如果值相同,则显式调用 refreshStartEndDates()。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-03-10
    • 1970-01-01
    • 2019-10-17
    • 2017-04-18
    • 2011-12-30
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多