2010-06-14 41 views
1

時,Flex認爲是這樣的:等效採用純ActionScript

<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」中提到的任何變量都在運行時保證存在。

我已經意識到有更直接的方法來完成這個確切的事情,並且只使用Flex/MXML。對我的項目來說非常重要,但我明白如何在沒有MXML的情況下實現這一點。

這樣做: lab.text = stringToBind.replace(「{myVar}」,str);

不會工作,因爲這只是簡單地將「{myVar}」 - (甚至可能不是「stringToBind」!!中引用的變量)的值賦值給標籤,並且不考慮何時和如果myVar變化!我不需要以某種方式使用像bindProperty?

+0

約書亞,我希望這是你想要的,或多或少: http://stackoverflow.com/questions/3081229/flex-actionscript-how-to-change-property-label-of-all-buttons/ 3084992#3084992 – amn 2010-06-24 18:50:09

回答

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語法。你還在使用Flex內部結合 - 但同樣,使用Label就使得如果Flexy

+0

你已經硬編碼了「StringToBind」。整個POINT就是在設計時不知道約束什麼。 – Joshua 2010-06-14 18:36:31

+0

如果以這種方式完成myVar更改,標籤文本也不會更改。 – Joshua 2010-06-14 18:47:23

+0

@Joshua你還嘗試過嗎?當'myVar'改變時,標籤文字將會改變。而關於硬編碼 - 這不像「'是硬編碼的。你可以在運行時更新'stringToBind'並使用我的第二個方法。 – Amarghosh 2010-06-15 03:44:04

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。

+0

你有硬編碼的「Hello World」和「MyVar」......這對我有什麼幫助? – Joshua 2010-06-14 20:41:00

0

披露:無恥的自我宣傳

BindageTools庫提供用於在ActionScript中設置綁定一個直觀的建設者API。