0

Flexには、IconItemRenderer基本クラスを拡張してカスタムIconItemRendererを作成するクラスがあります。リスト内でこのカスタムアイテムを使用しており、マウスの押下を聞いています。マウスを押す場所に応じて、さまざまなオプションがあります。その1つは、別のビューに移動することです。リストの変更リスナーを使用して新しいビューにプッシュする方法は知っていますが、実装したくありません。マウスクリックの考え方は、場所に応じて、リストから要素を削除したり、現在の要素を開いたりできるというものです。

私の人生では、IconItemRenderer内から新しいビューに移動するためのメソッドを見つけることができません。これは私が使用しているコードであり、クラスとそれを実装するリストの両方です。

package components  
{  
import spark.components.Button;  
import spark.components.IconItemRenderer;  
import spark.utils.MultiDPIBitmapSource;

public class DeleteItemRenderer extends IconItemRenderer
{
    private var btn:Button;
    private var xIcon:MultiDPIBitmapSource;

    public function DeleteItemRenderer()
    {
        super();
        super.iconWidth = super.iconHeight = 40;
        super.labelField = 'title';
        super.decorator = "assets/delete.png";
    }

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

    override protected function layoutContents(unscaledWidth:Number, unscaledHeight:Number):void{
        setElementPosition(decoratorDisplay, unscaledWidth-40, 5);
        setElementSize(decoratorDisplay, 40, 40);
    }

    override protected function measure():void{
        measuredHeight = 50;
    }

    override protected function drawBackground(unscaledWidth:Number, unscaledHeight:Number):void{
        graphics.beginFill(0xffffff);
        graphics.drawRect(0, 0, unscaledWidth, unscaledHeight);
        graphics.endFill();         
        decoratorDisplay.smooth = true; 
        graphics.lineStyle(1,0xcccccc,1);
        graphics.drawRect(0, 0, unscaledWidth, unscaledHeight);
        graphics.endFill();
    }
}
}

リスト

<s:List id="survey_list" visible="true" width="98%"  height="70%" contentBackgroundColor="#FFFFFF" horizontalCenter="0">            
    <s:itemRenderer>
        <fx:Component>
            <components:DeleteItemRenderer width="99.9%" height="98%" verticalAlign="top" click="detectActionPress();">
                <fx:Script>
                    <![CDATA[
                        import spark.components.ViewNavigator;
                        import spark.components.View;
                        import mx.events.FlexEvent;
                        import mx.core.FlexGlobals;
                        import mx.core.UIComponent;
                        import spark.components.List;

                        private var application:UIComponent = FlexGlobals.topLevelApplication as UIComponent;
                        private var pressOpen:Number = application.width - 40;
                        //private var _navigator:ViewNavigator = FlexGlobals.topLevelApplication.navigation; //navigation is not defined uhhhh why????

                        private function detectActionPress():void{
                            var localX:Number = this.mouseX;
                            if(localX <= pressOpen){
                                engangeElement();
                            }
                            else{
                                deleteElement();
                            }
                        }

                        private function deleteElement():void{
                            var parentList:List = owner as List;
                            parentList.dataProvider.removeItemAt(parentList.dataProvider.getItemIndex(data));                               
                            trace('element removed');
                        }

                        private function engangeElement():void{
                            var parentList:List = owner as List;

                            var _test:ViewNavigator = this.parentDocument as ViewNavigator;

                            //this.parentApplication.navigator.pushView(views.UnfinishedSurvey, parentList.selectedItem.shortcode)
                            _test.pushView(views.UnfinishedSurvey, parentList.selectedItem.shortcode);
                        }
                    ]]>
                </fx:Script>
            </components:DeleteItemRenderer>
        </fx:Component>
    </s:itemRenderer>       
</s:List>

ナビゲーターにアクセスできないのはengageElement();
なぜですか?

ありがとう

4

1 に答える 1

1

一般的; itemRenderer内からイベントをディスパッチすることをお勧めします。イベントがバブルすることを確認してください。

itemRenderer/Listの階層的な親であるクラスでイベントをリッスンできます。

イベントハンドラーでは、ナビゲーターにアクセスできます。

私はここでアプローチについて書きました; 詳細が記載されている場合があります。

これを行う別の方法があります。ナビゲーターへのインスタンスを持つクラスを使用し、ある種の依存性注入(DI)フレームワークを使用してそれをレンダラーに注入することができます。RobotlegsとSwizは、これをサポートする2つのActionScriptベースのフレームワークです。

于 2013-03-25T02:27:59.233 に答える