apache-flex 如果属性值未更改,是否未调用可绑定的setter?

eufgjt7s  于 2022-11-01  发布在  Apache
关注(0)|答案(2)|浏览(120)

(* 这可能是一个过于局部化的问题,但我会尝试将其概括)*

**问题:**如果属性setter标记为Bindable,则在新值与旧值相同时,是否不会调用该属性?

我在继承的遗留项目中看到了上述行为:setter不会被调用。如果我没有声明setter为Bindable,那么无论新值是什么,setter都会被调用。
有谁能证实上面的东西是被设计来与绑定一起工作的吗?
这个项目到处都使用Binding,代码中没有注解,所以很难判断依赖项是什么,以及代码的哪些部分依赖于特定的绑定。我试图避免进行重大修改,但我也不想浪费时间尝试解决一些应该重构的问题。

该属性已绑定:

[Bindable]
    protected var _source:AolMediaFile;

setter已绑定:

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

8dtrkrch1#

只有当事件源是[Bindable]时,才应该调用setter。数据绑定基本上是在各种情况下从源到目标调度的事件链。当你将属性或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]
如果无法生成绑定,编译器通常会打印警告:
警告:无法系结至类别'Object'上的属性'source'(类别不是IEventDispatcher)
因此,检查源对象,即源的宿主对象的依赖项和编译器警告。

dba5bblo

dba5bblo2#

所以我在这里再深入研究一下,发现了这个问题: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"));
}

相关问题