使用Pure Actionscript等效Flex DataBinding

时间:2010-06-14 05:13:21

标签: flex flash actionscript-3 actionscript air

当Flex看到这样的东西时:

<mx:Label text="Hello {MyVar} World!"/>

它必须以某种方式转换为ActionScript。但是如果我需要在运行时做类似的事情。我如何动态地完成什么?当我不知道绑定模板的内容时。

在ActionScript中,需要它看起来像这样的东西

public function CustomDynamicBinding(StringToBind:String):Label {
  // *EXAMPLES* Of StringToBind:
  //    "Hello {MyVar} World!"
  //    "Product: {name} ${price}.00"
  //    "{data.label}, {data.description}"
  // I've Written It This Way Because I DO NOT KNOW The Exact Text To Be Bound At Design Time.
  [Bindable]
    var Lab:Label=new Label();
    Lab.text=???
    return(Lab);
}

如何实现这种“动态”绑定...在运行之前我不知道“StringToBind”的值?出于这个问题的目的,我们可以假设我确实知道“StringToBind”中提到的任何变量都保证在运行时存在。

我已经意识到有更简单的方法可以实现STATICALLY,并且只使用Flex / MXML。这对我的项目很重要,但我了解如何在没有MXML的情况下实现这一目标。

这样做:     lab.text = stringToBind.replace(“{myVar}”,str);

不会起作用,因为这只是将“{myVar}”的值 - (可能甚至不是“stringToBind”中引用的变量!!)赋予标签,并且不考虑myVar的时间和时间变化!我不需要以某种方式使用像bindProperty这样的东西吗?

3 个答案:

答案 0 :(得分:3)

使用BindingUtils.bindSetter

var stringToBind:String = "Hello {myVar} World!";
[Bindable]
var myVar:String = 'Flex';
var lab:Label = new Label();
BindingUtils.bindSetter(labelValue, this, "myVar");
function set labelValue(str:String):void
{
  lab.text = "Hello " + str + " World!";
  //or if you want it dynamic
  lab.text = stringToBind.replace("{myVar}", str);
}

请注意,严格意义上讲,这不是纯ActionScript,因为数据绑定本身就是Flex概念;这只是MXML-less的语法。您仍然在内部使用Flex绑定 - 但是,如果 Flexy

,则仅使用Label

答案 1 :(得分:1)

private function _BindingSource_bindingsSetup():Array
{
    var result:Array = [];

    result[0] = new mx.binding.Binding(this,
        function():String
        {
            var result:* = "Hello " + (MyVar) + " World!";
            return (result == undefined ? null : String(result));
        },
        null,
        "_BindingSource_Label1.text"
        );


    return result;
}

它只是生成代码的一部分。您可以随意将-keep-generated-actionscript参数添加到编译器选项中,并在bin-debug\generated中读取所有生成的ActionScript。

答案 2 :(得分:0)

披露:无耻的自我推销

BindageTools库提供了一个直观的构建器API,用于在ActionScript中设置绑定。