2009-05-25 43 views
3

我有一個自定義的動作腳本對象被定義爲可綁定的一些公共屬性。flex似乎沒有綁定自定義動作對象

[Bindable] 
public class MyObject extends Object { 

    public var mobileNumber:String; 
... 

在我的MXML我有:

<mx:Script><![CDATA[ 
    import mx.binding.utils.BindingUtils; 
    import org.test.MyObject; 

    [Bindable] 
    private var obj: MyObject = new MyObject(); 
]]></mx:Script> 

<mx:Label text="Mobile Number" id="mobileNumberLabel"/> 
<mx:TextInput id="mobileNumberText" text="{obj.mobileNumber}" /> 

<mx:LinkButton label="Load" id="loadButton" enabled="true" click="obj = obj.load();"/> 
<mx:LinkButton label="Save" id="saveButton" enabled="true" click="obj.write();"/> 

我的問題是,當我在手機號碼欄中輸入一個新值,然後單擊保存按鈕,輸入的值不會退出...即:

public function write():void { 
     var bytes:ByteArray = new ByteArray(); 
     trace("write - mobile:" + this.mobileNumber); 

     bytes.writeObject(this); 
     EncryptedLocalStore.setItem(KEY, bytes); 
    } 

我也嘗試添加在:

private function init():void { 
     BindingUtils.bindProperty(mobileNumberText, "text", obj, "mobileNumber"); 
    } 

但沒有運氣。

我可能在這裏錯過了一些簡單的東西,但不知道它是什麼。希望你能幫忙,謝謝。

回答

8

尖沙咀的答案是正確的 - 綁定是單向的。我猜你已經知道,因爲你試圖在你的init()方法中設置反向綁定。

但是,init()方法有兩個問題。

首先,你不知道把init()方法放在哪裏,或者是什麼調用它。

其次,你得到的方法參數向後。

我通常做在這樣的情況下或者是使用MXML標籤作爲第一響應者建議,或者如果我在AS3代碼的時候,我做這樣的事情:

private function onCreationComplete(event:Event):void 
{ 
    BindingUtils.bindProperty(obj, "mobileNumber", mobileNumberText, ["text"]); 
} 

注一對夫婦點在這裏:

1/BindingUtils.bindProperty()是「左側=右側」。因此,它有點像寫

obj.mobileNumber = mobileNumberText.text; 

或者,更貼近什麼是「實際發生的」綁定類中:

obj["mobileNumber"] = mobileNumberText["text"]; 

2/BindingUtils.bindProperty()實際上想要一個數組作爲最後一個PARAM。這使你可以做「連鎖性」邏輯,如:

obj.mobileNumber = mobileNumbersGrid.selectedItem.text; 

這將是

BindingUtils.bindProperty(obj, "mobileNumber", mobileNumbersGrid, 
    ["selectedItem", "text"]); 

3 /最佳實踐提示:如果你綁定屬性鏈,其初始成員是自己的財產(本),然後把它寫爲:

BindingUtils.bindProperty(obj, "mobileNumber", this, 
    ["mobileNumbersGrid", "selectedItem", "text"]); 

這整齊地處理您的「右手邊對象」 this.mobileNumbersGrid實例本身被替換爲新的實例對象的情況。

4 /如果您曾經重新分配obj(「左側」),則需要爲新的obj實例創建新的綁定。

public function get obj():MyObject 
    { 
    return _obj; 
    } 

    private var _obj:MyObject = new MyObject(); 

    public function set obj(value:MyObject):void 
    { 
    _obj = value; 
    BindingUtils.bindProperty(_obj, "mobileNumber", mobileNumberText, ["text"]); 
    } 

(注:通常情況下,通過開啓本地的obj財產成的getter/setter對這樣做非常小心,你會藏匿從BindingUtils.bindProperty(),這是返回的值一個ChangeWatcher實例,並且您將使用unwatch()來防止舊對象接收屬性更改)

希望這會有所幫助。綁定是Flex框架中功能最強大的工具之一,但使用不當時會造成很多麻煩。特別是,當綁定「懸而未決」時,要注意內存泄漏和「意外更新」。

+0

Kieren H - 這是否解決您的問題?請標記爲已回答! – verveguy 2009-05-27 03:37:03

+0

很好。 – 2009-06-06 18:11:07

+0

你是一個完整的傳奇人物 - 我一直有這麼多的綁定問題,你的答案在這裏解釋了很多正在發生的事情,以及爲什麼事情似乎隨機不會有用。 GW – dalyons 2009-12-17 22:39:07

0

你試過執行IEventDispatcher還是延伸EventDispatcher

綁定工作通過PropertyChangeEvents調度,所以也許這是問題? 另外,我不確定綁定是否適用於變量,或者它們是否需要屬性(getter/setter)。

你應該嘗試用-keep產生-動作編譯,看看生成的代碼使任何意義,即分派任何事件,如果變量被訪問......

1

此代碼:

<mx:TextInput id="mobileNumberText" text="{obj.mobileNumber}" /> 

在obj.mobileNumber和mobileNumberText.text之間進行單向綁定。你需要的是一個額外的反向綁定 - 將下面的行添加到您的代碼,它會工作:

<mx:Binding source="mobileNumberText.text" destination="obj.mobileNumber"/> 
相關問題