不要害怕 MXML。它非常适合布置视图。如果您编写自己的可重用组件,那么在 ActionScript 中编写它们有时可能会给您更多的控制权,但对于不可重用的视图,MXML 更好。它更简洁,绑定非常容易设置,等等。
但是,纯 ActionScript 中的绑定不必那么痛苦。它永远不会像在 MXML 中为您完成很多事情那样简单,但它可以不费力气地完成。
你所拥有的是BindingUtils
和它的方法bindSetter
和bindProperty
。我几乎总是使用前者,因为我通常想做一些工作,或者invalidateProperties
在值更改时调用,我几乎从不想设置一个属性。
您需要知道的是,这两个返回一个类型为 的对象ChangeWatcher
,如果您出于某种原因要删除绑定,则必须保留该对象。这就是使 ActionScript 中的手动绑定不如 MXML 中方便的原因。
让我们从一个简单的例子开始:
BindingUtils.bindSetter(nameChanged, selectedEmployee, "name");
这设置了一个绑定,该绑定将在变量中对象的属性更改nameChanged
时调用该方法。该方法将接收属性的新值作为参数,因此它应该如下所示:name
selectedEmployee
nameChanged
name
private function nameChanged( newName : String ) : void
这个简单示例的问题在于,一旦您设置了此绑定,它将在每次指定对象的属性更改时触发。变量的值selectedEmployee
可能会改变,但仍然为变量之前指向的对象设置了绑定。
有两种方法可以解决这个问题:要么保留aroundChangeWatcher
返回的BindingUtils.bindSetter
值,并在你想删除绑定时调用unwatch
它(然后设置一个新的绑定),或者绑定到你自己。我将首先向您展示第一个选项,然后解释我所说的绑定到自己的意思。
可以将currentEmployee
其制成 getter/setter 对并像这样实现(仅显示 setter):
public function set currentEmployee( employee : Employee ) : void {
if ( _currentEmployee != employee ) {
if ( _currentEmployee != null ) {
currentEmployeeNameCW.unwatch();
}
_currentEmployee = employee;
if ( _currentEmployee != null ) {
currentEmployeeNameCW = BindingUtils.bindSetter(currentEmployeeNameChanged, _currentEmployee, "name");
}
}
}
发生的情况是,当设置currentEmployee
属性时,它会查看是否存在先前的值,如果是,则删除该对象的绑定 ( currentEmployeeNameCW.unwatch()
),然后设置私有变量,除非新值null
设置为新绑定为name
财产。最重要的是它保存了ChangeWatcher
绑定调用返回的内容。
这是一个基本的绑定模式,我认为它工作得很好。然而,有一个技巧可以让它变得更简单一些。您可以改为绑定到自己。currentEmployee
您可以让绑定系统为您完成,而不是每次属性更改时都设置和删除绑定。在您的creationComplete
处理程序(或构造函数或至少提前一段时间)中,您可以像这样设置绑定:
BindingUtils.bindSetter(currentEmployeeNameChanged, this, ["currentEmployee", "name"]);
这不仅设置了与 上的currentEmployee
属性的绑定this
,而且还设置了name
与此对象上的属性的绑定。因此,无论何时更改,currentEmployeeNameChanged
都会调用该方法。无需保存,ChangeWatcher
因为永远不必删除绑定。
第二个解决方案在很多情况下都有效,但我发现第一个解决方案有时是必要的,尤其是在使用非视图类中的绑定时(因为this
必须是事件调度程序并且currentEmployee
必须是可绑定的才能工作) .