2012-01-19 5 views
0

クラスDog。犬はその場所が何であるか分からないことに注意してください。論理的には、犬はその位置を知るべきではありません。アイテムレンダラーのクラスを含むメソッドを呼び出す

public class Dog { 
    public var name:String; 
    public var age:Number; 
} 

すべての犬をリストに表示するUIコンポーネントです。犬がエスケープしたかどうかを判断する方法があります。

<?xml version="1.0" encoding="utf-8"?> 
<s:VGroup ... > 
    <fx:Script> 
     <![CDATA[ 
      [Bindable] 
      private var listDataProvider:ArrayCollection /* ArrayCollection of Dogs */ 

      public var hasDogEscaped(dog:Dog):Boolean { 
       return ...; 
      } 
     ]]> 
    </fx:Script> 
    <s:List id="list" dataProvider="{listDataProvider}" itemRenderer="DogItemRenderer"/> 
</s:VGroup> 

アイテムレンダラーが犬の名前を表示し、犬が犬の名前の横に説明マークをエスケープしている場合。私がやりたい何

<?xml version="1.0" encoding="utf-8"?> 
<s:ItemRenderer ...> 
    <s:Label text="{(data as dog).name}" verticalAlign="middle" height="100%"/> 

    <mx:Image id="dogEscaped" 
       visible="{???????????????????????????????????????.hasDogEscaped(data as Dog)}" 
       source="@Embed(source='/assets/icons/warning.png')"/> 
    </s:Group> 
</s:ItemRenderer> 

は、アイテムレンダラーがアイテムレンダラーからhasDogEscapedメソッドを呼び出す必要がありですが、私はそれを行う方法を見つけ出すことができませんでした。どんな助けでも大歓迎です。

答えて

0

要するに、DogクラスにisVisibleプロパティを追加する必要があります。犬はその場所を知るべきではありませんが、目に見えるかどうかを知る必要があります。アイテムレンダラーへのパス(およびアイテムレンダラーからのパス)を作成することは、一般的には悪い考えです。 (これがDogクラスのスコープを超えている場合は、アダプタパターンを使用して既存のクラスをラップし、追加のプロパティを追加できます)。アイテムレンダラーは、レンダリングしているものを正しく表示するために必要なすべてのデータを受け取る必要があります。

s:List - を定義するMXMLファイルでこのプロパティの値を設定し、アイテムレンダラーでsetデータメソッドをオーバーライドして、イメージを表示する必要があるかどうかを判断できます。

+0

ええ、これは私が答えがあると思ったものです。Dogクラスには何も追加しません。なぜなら、コードベースのさまざまな場所で何百もの時間が使われているからです。今すぐアダプターのパターンを見て.... – sixtyfootersdude

2

私は関数にバインドしません。あなたはとにかくする必要はありません。あなたのデータグリッドにyourFunctionの非静的バージョンを渡したい場合は

override public function set data(value:Object):void{ 
    if(value){ 
    super.data = value; 
    dogEscaped.visible = yourFunction(data); 
    } 
} 

は今、あなたは、プロパティとして追加する必要があります。これを行うには、ClassFactoryを使用してitemRendererにプロパティを渡す必要があります。基本的に、それは次のようになります。

dogItemRenderer= new ClassFactory(DogIteMRenderer); 
dogItemRenderer.properties = {dogEscapedFunction: dogEscapedFunction}; 
dogColumn.itemRenderer = dogItemRenderer; 

は今、あなたのitemRendererでdogEscapedFunctionと呼ばれるプロパティがありますことを確認してください。

0

アイテムレンダラーは、アプリケーションロジック用ではなくデータを表示するためのものです。
あなたのarrayCollectionはすでにバインド可能なので、イベントリスナーを追加して、変更時にhasDogEscapedを呼び出す必要があります。

0

また、このようsoemthingを行うことができます:

protected var escapeAlarm:IEventDispatcher; 
[Bindable] 
protected var dogItemRenderer:ClassFactory = new ClassFactory(DogItemRenderer);//you can bind to this renderer in your List component or whatever 

//call from creationComplete 
protected function init():void { 
    dogItemRenderer.properties = {alarm: escapeAlarm};//again, you'll need to expose an alarm property on your renderer 
} 

public function dogHasEscaped(escapee:Dog):void { 
    escapeAlarm.dispatchEvent(new DogHasEscapedEvent('escapeAlert', escapee);//will need custom Event Class, post back if you need help 
} 

は、その後、あなたのレンダラでは、単にレンダリングされた犬に逃げ犬を比較します。これは、リストが描画された後にエスケープする犬を説明します。

0

"outerDocument"を使用して、そのメソッドを含むドキュメントにアクセスできます。注:メソッドはpublicとマークする必要があります。

MyDogUtils.hasDogEscaped()のようなシングルトンに関数を置き、アイテムレンダラー内から必要なときに呼び出すことができます(99%常に設定データオーバーライド時)。

また、静的メソッドとしてアイテムレンダラーに配置することもできます。

+0

注:outerDocumentでメソッドに到達するには、そのメソッドが別の文書にあるのでpublicにマークする必要があります。 –

関連する問題