当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这样的东西吗?
答案 0 :(得分:3)
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中设置绑定。