如果属性值没有改变,则不会调用可绑定的setter?

时间:2014-12-29 16:26:21

标签: actionscript-3 flex flex4

这可能是一个过于本地化的问题,但我会尝试概括它)

问题:如果属性setter被标记为Bindable,如果新值与旧值相同,是否会调用它?

我在我继承的遗留项目中看到了上述行为:setter没有被调用。如果我没有将setter声明为Bindable,则无论新值是什么,都会调用setter。

任何人都可以确认以上是设计用于绑定的方式吗?

这个项目在整个地方使用Binding,代码中没有注释,因此很难分辨出依赖项是什么以及代码的哪些部分依赖于特定的绑定。我试图避免做出重大改变,但我也不想浪费时间去尝试解决应该重构的事情。

该属性已绑定:

    [Bindable]
    protected var _source:AolMediaFile;

设置者绑定:

    [Bindable]
    public function set source(file:AolMediaFile):void{
          _source = file;
         // do some stuff with file
    }

2 个答案:

答案 0 :(得分:1)

所以我在这里挖掘了一下这个问题:Flex: Help me understand data Binding on getters and setters描述了通过声明一个setter或getter生成的代码Bindable

显然,在生成的代码中,检查值是否不同:

public function set name(value:String)
{
    if (_name == value)
        return;
    _name = value;
    dispatchEvent(new Event("nameChanged"));
}

答案 1 :(得分:1)

只有在事件源为[Bindable]时才会调用setter。数据绑定基本上是在各种场景中从源到目标调度的一系列事件。当您将属性或设置器声明为[Bindable]时,在基本效果方面基本上不会改变任何内容,因为会调度事件并生成侦听器。例如:

<your:Component source="{any.source.aolMediaFile}" />

仅当anysourceaolMediaFile被声明为[Bindable]时,才会调用source。将source声明为[Bindable]属性只是有趣的,如果第二个组件取决于您的组件状态

<your:Component id="yourComponent" source="{any.source.aolMediaFile}" />
<s:TextField text="{yourComponent.source}" />

如果您想要绑定到AolMediaFile的属性,那么该类或特定属性也必须是[Bindable]

如果无法生成绑定,编译器通常会打印警告:

  

警告:无法绑定到属性&#39;来源&#39;在课堂&#39;对象&#39;   (类不是IEventDispatcher)

请检查源对象,它是源主机对象的依赖关系和编译器警告。