Flex:是否存在无痛的程序化数据绑定?

到目前为止,我只做了一些Flex开发,但是我更喜欢以mxml文件编程方式创建控件,因为(请,如果我错了,请纠正我)收集到你可以’有两种方式 – 也就是说,在单独的ActionScript类文件中具有类功能,但是在mxml中声明了包含的元素.

在生产力方面似乎并没有太大差异,但是编程中的数据绑定看起来似乎并不是简单的.我看了一下mxml编译器如何转换数据绑定表达式.结果是一堆生成的回调,并且比mxml表示中的行多得多.所以这里是一个问题:有没有办法以编程方式进行数据绑定,不涉及一个受伤的世界?

不要害怕M XML.这是很好的布置意见.如果你编写自己的可重用组件,那么在ActionScript中编写它们有时可以给你一些更多的控制,但是对于不可重用的视图,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必须可绑定到工作).

相关文章
相关标签/搜索