在生产力方面似乎并没有太大差异,但是编程中的数据绑定看起来似乎并不是简单的.我看了一下mxml编译器如何转换数据绑定表达式.结果是一堆生成的回调,并且比mxml表示中的行多得多.所以这里是一个问题:有没有办法以编程方式进行数据绑定,不涉及一个受伤的世界?
解决方法
然而,纯ActionScript中的绑定并不是那么痛苦.它将永远不会像MXML那样简单,那里为您完成了很多事情,但是可以不用太多的努力来完成.
你有的是BindingUtils,它的方法是bindSetter和bindProperty.我几乎总是使用前者,因为我通常想做一些工作,或者在值改变时调用invalidateProperties,我几乎从不想设置一个属性.
你需要知道的是这两个返回一个类型为ChangeWatcher的对象,如果你想删除绑定由于某种原因,你必须坚持这个对象.这就是使ActionScript中的手动绑定比MXML中的一些方便.
我们从一个简单的例子开始:
BindingUtils.bindSetter(nameChanged,selectedEmployee,"name");
这将设置一个绑定,当变量selectedEmployee中的对象的name属性更改时,将调用方法nameChanged. nameChanged方法将接收name属性的新值作为参数,因此应该如下所示:
private function nameChanged( newName : String ) : void
这个简单示例的问题是,一旦设置了此绑定,每次指定对象的属性更改时,它将触发.变量selectedEmployee的值可能会更改,但仍然为变量指向的对象设置绑定.
有两种方法来解决这个问题:要么保持BindingUtils.bindSetter返回的ChangeWatcher,要在删除绑定(然后再设置一个新的绑定)或者绑定到你自己的时候调用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设置名称属性的新绑定.最重要的是它保存了绑定调用返回的ChangeWatcher.
这是一个基本的绑定模式,我认为它工作正常.然而,有一个可以用来使它更简单的技巧.你可以绑定到你自己.每当currentEmployee属性更改时,不必设置和删除绑定,您可以让绑定系统为您执行.在您的创建完成处理程序(或构造函数或至少一段时间的早期)中,您可以像这样设置绑定:
BindingUtils.bindSetter(currentEmployeeNameChanged,this,["currentEmployee","name"]);
这不仅设置了对此的currentEmployee属性的绑定,还设置了此对象上的name属性.所以随时更改方法currentEmployeeNameChanged将被调用.没有必要保存ChangeWatcher,因为绑定永远不会被删除.
第二个解决方案在许多情况下工作,但是我发现第一个解决方案有时是必需的,特别是在非视图类中使用绑定时(因为这必须是一个事件调度器,而且currentEmployee必须可绑定到工作).