2009-05-29 7 views
22

フォーム要素にバインドするダースフィールドを含むオブジェクトがあります。そのオブジェクトを使用してデータをサーバーに送り返して保存することができます。私のコンテナオブジェクトのフレックス警告: 'Object'クラスのプロパティ 'foo'にバインドできません(クラスはIEventDispatcherではありません)

定義:

private static const emptyLink:Object = { 
    id: -1, title:'', 
    trigger1:'',trigger2:'',trigger3:'',trigger4:'',trigger5:'', 
    linkTitle:'', linkBody:'', 
    answer1:'',answer2:'',answer3:'',answer4:'',answer5:'' 
}; 

[Bindable] public var currentLink:Object = emptyLink; 

currentLinkは、私はちょうど主に、初期化の目的のためにemptyLinkオブジェクトを使用しています、のArrayCollectionから特定のインデックスに、実行時に割り当てられます。もちろん

<mx:Panel id="triggerPanel" title="Trigger" width="33%"> 
    <mx:VBox id="tpBoxes" width="100%" paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5"> 
     <mx:TextInput id="trigger1" width="100%" textAlign="left" text="{currentLink.trigger1}" /> 
     <mx:TextInput id="trigger2" width="100%" textAlign="left" text="{currentLink.trigger2}" /> 
     <mx:TextInput id="trigger3" width="100%" textAlign="left" text="{currentLink.trigger3}" /> 
     <mx:TextInput id="trigger4" width="100%" textAlign="left" text="{currentLink.trigger4}" /> 
     <mx:TextInput id="trigger5" width="100%" textAlign="left" text="{currentLink.trigger5}" /> 
    </mx:VBox> 
</mx:Panel> 

、これはコンパイルし、ディスプレイだけで罰金が、各インスタンスのランタイムの警告があります。

警告:プロパティにバインドすることができませんでし「TRIGGER1」クラスのオブジェクトの上(クラスがあるが(クラスはIEventDispatcherではありません) 警告: 'Object'クラスのプロパティ 'trigger2'にバインドできません(クラスはIEventDispatcherではありません) 警告:クラス 'Object' 警告: 'Object'クラスのプロパティ 'trigger4'にバインドできません(クラスはIEventDispatcherではありません) 警告:クラスのオブジェクト「オン「trigger5」プロパティにバインドすることができない(クラスがIEventDispatcherのではありません)

そしてTextInputフィールドが変更された場合currentLinkオブジェクトは更新されません。

明白な答えは、私のオブジェクトがIEventDispatcherを実装するクラスのインスタンスである必要があるということです。その答えが私に教えてくれないのは、そのインターフェースを実装することの詳細です(何が必要なのですか?)何か簡単な方法があれば - カスタムプロパティを喜んで受け入れてくれますバインディングのために、インターフェイスを実装する際の細部について心配する必要はありません。

このようなクラスは存在しますか?そうでない場合は、この作業を達成するための最低限の、および/または容認された基準は何ですか?

答えて

15

あなたは(チェタンが言及したように)ObjectProxyを使用する必要があります - しかし、あなたはまた、あなたが戻ってあなたのオブジェクトへの入力に入力したテキストを取得するためにはvalueCommitを使用する必要があります。一般的には

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
    <mx:Script> 
     <![CDATA[ 
      import mx.utils.ObjectProxy; 
       private static const emptyLink:Object = { 
    id: -1, title:'', 
    trigger1:'',trigger2:'',trigger3:'',trigger4:'',trigger5:'', 
    linkTitle:'', linkBody:'', 
    answer1:'',answer2:'',answer3:'',answer4:'',answer5:'' 
}; 

[Bindable] public var currentLink:ObjectProxy = new ObjectProxy(emptyLink); 


private function handleClick():void 
{ 
    trace(currentLink.trigger1); 
} 
]]> 
</mx:Script> 

<mx:Panel id="triggerPanel" title="Trigger" width="33%"> 
     <mx:VBox id="tpBoxes" width="100%" paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5"> 
       <mx:TextInput id="trigger1" width="100%" textAlign="left" text="{currentLink.trigger1}" valueCommit="{currentLink.trigger1 = trigger1.text;}"/> 

       <mx:Button label="Click" click="handleClick()"/> 
     </mx:VBox> 
</mx:Panel>   

</mx:WindowedApplication> 
0

私はFlexを非常に長く使っていません。これはあなたの要件に合わないかもしれませんが、なぜXMLを使用しないのですか? TextInputテキスト値をXMLの属性に設定できると思います。

私は擬似コードを使用していますが、このような何かが私には理にかなって:このような

[Bindable] private static const currentLink:XML = <root> 
                <trigger1 value=""/> 
                <trigger2 value="" /> 
                </root>; 
... 
<mx:TextInput id="trigger1" width ... text="{[email protected]}" /> 

何かを、おそらく?

8

Objectイベントを送出しません。変数Bindableを作成したにもかかわらず、変数currentLinkによって参照されるオブジェクトのプロパティはバインドできません。

代わりにObjectProxyを使用してください。

[Bindable] public var currentLink:ObjectProxy = new ObjectProxy(emptyLink); 
1

Here's the livedocs referenceインターフェイスです。それはかなり明らかでしょう。引用する

:一般的に

、イベント送出機能を得るために、ユーザー定義クラスのための最も簡単な方法は、EventDispatcherを拡張することです。したがって

プライベート静的定数emptyLink:のEventDispatcher = {

+0

あなたのリンクは、考えていたlivedocs内のページには移動しません。各livedocsの参照ページには、フッターに「現在のリンク:...」と表示されているページを直接リンクするためのURLがあります。それを使用してください。 :) –

4

あなたが知っているしたいと思う最初の事は、Flex 3の結合は双方向ではないということです。バインディング式(currentLink.trigger1)のソースが変更された場合、ターゲット(TextInput)はそれに応じて変更通知を受け取ることになります。あなたはバインディングが他の方向に行きたい場合は、これを実行するには、少なくとも2つの方法があります。

  1. はMXを使用してください:バインディングタグを行うために戻ってオブジェクトへ
  2. 使用BindingUtilsをTextInput.textを指示します代わりにこれをプログラムで実行します。あなたが受信しているエラーを:彼らは、@ {some.binding.expression}を結合双方向の新しい構文を導入しているが、それは第二の部分でのFlex 3

    では利用できないのFlex 4では

「汎用」プロトタイプオブジェクトにバインドするためです。 [Bindable]メタデータタグをプロパティまたはクラスに適用すると、MXMLCコンパイラはバインディングユーティリティとプロパティ変更ウォッチャを使用してバインディングを行うASコードを生成します。しかし、プロトタイプObjectを組み込みのものにすることはできません。バインド可能な(またはバインド可能な特定のプロパティを持つ)カスタムActionScriptクラスを作成できます。 MXMLCコンパイラは、IEventDispatcherを実装するクラスを生成し、したがってバインディングをサポートします。これはプロトタイプのオブジェクトより高速であるという利点があり、コンパイル時のチェックも行います。つまり、無効なプロパティを参照するとコンパイラエラーが発生します。

もう1つの方法は、他のSOメンバーの1つが示唆しているように、ObjectProxyでプロトタイプをラップすることです。

+0

私は2つの答えを受け入れることができれば、これは#2だろう。私はGabriel'sを選んだのは、それが私がやろうとしていることをする最も簡単な解決策だったからです。しかし、すべての情報をありがとう! –

1

、なぜ理由をget "がクラスのプロパティfooにバインドできない場合は、はfooのゲッターまたはセッターが不足しているためです。あなた(これはカプセル化を壊すが)もですから、それが離れて行くように、これらの両方を必要とし、fooがパブリック変数にスコープ

を作ることができる:

public function set foo (o:FooObject) : void { 
... 
} 

または

public function get foo() : FooObject { 
... 
} 
2

大きなプロジェクトで問題のコードを見つける方法のヒント - 2つにブレークポイントを設定する

trace("warning: unable to bind to property '" 

SDKのPropertyWatcherクラス([ナビゲート]> [開くタイプ> ...])の行。 Stacktraceは、破損したバインディングを保持するUIコンポーネントを見つけるのを手伝います。

関連する問題