当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Flex:是否存在无痛的程序化数据绑定?》经验,为你挑选了2个好方法。

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

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



1> Theo..:

不要害怕MXML.它非常适合布置视图.如果您编写自己的可重用组件,那么在ActionScript中编写它们有时可能会给您更多控制权,但对于不可重用的视图,MXML要好得多.它更简洁,绑定很容易设置,等等.

但是,纯ActionScript中的绑定不需要那么多痛苦.它永远不会像MXML那样简单,为你做了很多事情,但它可以通过不费力气来完成.

你拥有的是BindingUtils它的方法bindSetter和方法bindProperty.我几乎总是使用前者,因为我通常想做一些工作,或者invalidateProperties当值改变时调用,我几乎从不想要设置属性.

你需要知道的是这两个返回一个类型的对象ChangeWatcher,如果你想因某种原因删除绑定,你必须坚持这个对象.这使得ActionScript中的手动绑定比MXML中的手动绑定更不方便.

让我们从一个简单的例子开始:

BindingUtils.bindSetter(nameChanged, selectedEmployee, "name");

这将设置一个绑定,nameChangedname变量中对象的属性selectedEmployee发生更改时,该绑定将调用该方法.该nameChanged方法将接收name属性的新值作为参数,因此它应如下所示:

private function nameChanged( newName : String ) : void 

这个简单示例的问题在于,一旦设置了此绑定,每次指定对象的属性发生更改时,它都会触发.变量的值selectedEmployee可能会更改,但仍会为变量指向的对象设置绑定.

有两种方法可以解决这个问题:要么保留周围的ChangeWatcher返回值,要么在想要删除绑定时BindingUtils.bindSetter调用unwatch它(然后再设置新的绑定),或绑定到自己.我先向您展示第一个选项,然后通过绑定自己来解释我的意思.

所述currentEmployee可被制成的getter/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必须可绑定才能使其工作) .



2> qualidafial..:

它存在于今天.:)

我刚刚发布了我的ActionScript数据绑定项目作为开源:http://code.google.com/p/bindage-tools

BindageTools是BindingUtils的替代品(请参阅那里的文字?),它使用流畅的API,您可以在管道样式中声明数据绑定:

Bind.fromProperty(person, "firstName")
    .toProperty(firstNameInput, "text");

双向绑定:

Bind.twoWay(
    Bind.fromProperty(person, "firstName"),
    Bind.fromProperty(firstNameInput, "text"));

显式数据转换和验证:

Bind.twoWay(
    Bind.fromProperty(person, "age")
        .convert(valueToString()),
    Bind.fromProperty(ageInput, "text")
        .validate(isNumeric()) // (Hamcrest-as3 matcher)
        .convert(toNumber()));

等等.网站上有更多的例子.还有许多其他功能 - 来看看. - 马修

编辑:更新的API

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有