(* 这可能是一个过于局部化的问题,但我会尝试将其概括)*
**问题:**如果属性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
}
2条答案
按热度按时间8dtrkrch1#
只有当事件源是
[Bindable]
时,才应该调用setter。数据绑定基本上是在各种情况下从源到目标调度的事件链。当你将属性或setter声明为[Bindable]
时,基本上不会改变行为的副作用,因为事件被调度,监听器被生成。例如:只有当
any
、source
和aolMediaFile
声明为[Bindable]
时,才会调用source
。将source
声明为[Bindable]
属性只有在第二个组件依赖于您的组件的状态时才有意义如果要绑定到
AolMediaFile
的属性,则类或特定属性也必须是[Bindable]
。如果无法生成绑定,编译器通常会打印警告:
警告:无法系结至类别'Object'上的属性'source'(类别不是IEventDispatcher)
因此,检查源对象,即源的宿主对象的依赖项和编译器警告。
dba5bblo2#
所以我在这里再深入研究一下,发现了这个问题:Flex: Help me understand data Binding on getters and setters,它描述通过声明setter或getter
Bindable
生成的代码因此,显然在生成的代码中有一个检查,以查看值是否不同: