2009-05-25 3 views
3

私は、いくつかのパブリックプロパティでバインド可能と定義されたカスタムのactionscriptオブジェクトを持っています。flexはカスタムのactionscriptオブジェクトとバインドしていないようです

[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

tstの回答は正しい - バインディングは一方向です。私はあなたがすでにそれを知っていたと推測しています。は、をinit()メソッドで逆バインドを設定しようとしたためです。

しかし、init()メソッドには2つの問題があります。

まず、init()メソッドをどこに置くか、何を呼び出すのかは不明です。

第2に、メソッドパラメータを後方に持っています。

私は通常、このような状況では何であるのいずれかファーストレスポンダが提案、または私はAS3のコードにいるならば、私はこのような何かがそうであるようにMXMLタグを使用します。

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。

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

3 /ベスト・プラクティスのヒントになり

obj.mobileNumber = mobileNumbersGrid.selectedItem.text; 

:あなたはその初期メンバーであるプロパティチェーンを結合している場合は、論理的のような「プロパティをチェーン」んできるようにするためですこれはきちんとthis.mobileNumbersGridインスタンス自体は、新しいインスタンスオブジェクトに置き換えられ、あなたの「右側のオブジェクト」ケースを扱う

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

:自分の財産(この)、その後、としてそれを書きます。

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プロパティを回すことによって、これを行う本当に注意しなければ、あなたはあるBindingUtils.bindProperty()から返された値を隠しておくだろうChangeWatcherインスタンスであり、古いオブジェクトがプロパティの変更を受け取らないようにするためにunwatch()を使用します)

これは役立ちます。バインディングはFlexフレームワークの中で最も強力なツールの1つですが、使い方が悪いと頭痛が増えます。特に、バインディングが「ぶら下がっている」場合、メモリリークと「予期しない更新」に注意してください。

+0

Kieren H - これで問題は解決しますか?もしそうなら、答えを記入してください! – verveguy

+0

ええ、たくさん。 –

+0

あなたは伝説的な伝説であり、拘束力の問題がたくさんありました。あなたの答えはここで何が起こっているのかを説明しています。 GW – dalyons

0

IEventDispatcherを実装するか、EventDispatcherを実装してみましたか?

バインディングはPropertyChangeEventsのディスパッチで機能するので、多分これは問題ですか? また、バインディングが変数で機能するかどうか、またはプロパティ(ゲッタ/セッタ)が必要かどうかはわかりません。

変数がアクセスされた場合は、-keep-生成し、ActionScriptを使用してコンパイルしようとすると、結果のコードは、どんな意味があるかどうかを確認する必要があり、すなわち、任意のイベントを送出します...

1

このコード:

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

は、obj.mobileNumberとmobileNumberText.textの間に一方向のバインディングを行います。追加の逆バインドが必要です。コードに次の行を追加すれば動作します。

<mx:Binding source="mobileNumberText.text" destination="obj.mobileNumber"/> 
関連する問題