我在Flex中有一个值对象,如下所示:
[绑定]
public class MyVO
{
public var a:ArrayCollection;
public var b:ArrayCollection;
private var timeSort:Sort;
public function ShiftVO(){
timeSort = new Sort();
timeSort.compareFunction = sortDates;
}
public function get times():ArrayCollection{
var ac:ArrayCollection = new ArrayCollection(a.toArray().concat(b.toArray()));
ac.sort = timeSort;
ac.refresh();
return ac;
}
这是关于getter方法的。我在数据网格中显示getter的数据,每当我更改a
或b
的某些值时,我也想更新视图。我该如何实现这一目标?目前视图不会自动更新,我必须再次打开视图才能看到新值。
答案 0 :(得分:3)
当您创建属性[Bindable]
时,Flex将在调用其setter时读取getter(即,在更新属性时);您尚未声明任何setter,因此Flex无法知道属性的值已更新。
您必须定义both a setter and a getter method以将[Bindable]标记与属性一起使用。如果仅定义setter方法,则创建一个只写属性,不能将其用作数据绑定表达式的源。如果只定义一个getter方法,则创建一个只读属性,可以将其用作数据绑定表达式的源,而无需插入[Bindable]元数据标记。这类似于使用const关键字定义的变量作为数据绑定表达式的源的方式。
您可以定义一个空的setter,并在更新a或b时调用它。
public function set times(ac:ArrayCollection):void { }
//somewhere else in the code:
a = someArrayCol;
/**
* this will invoke the setter which will in turn
* invoke the bindable getter and update the values
* */
times = null;
注意到你在课堂上使用Bindable而不是属性:当你使用Bindable tag this way时,它会使
可用作绑定表达式的源,您定义为变量的所有公共属性,以及使用setter和getter方法定义的所有公共属性。
因此,除非定义一个setter,否则即使将整个类声明为可绑定,该属性也不可绑定。