1

私は Flex を初めて使用するので、質問が非常に基本的なものである場合はご容赦ください。ここに投稿する前によく検索しましたが、正しい方向を見ていない可能性があります。問題の解決につながるパスにリダイレクトしてください。私が得ることができるどんな助けにも本当に感謝しています。

私はこのビデオチュートリアルに従っています。(動画のような単純な Flex プロジェクトではなく、モバイル プロジェクトを作成していました)

http://www.gotoandlearn.com/play.php?id=100

家庭教師がアプリケーションにカスタム コンポーネントを追加するまでは、すべてが順調に進んでいました。彼は私が Flash Builder 4.6 で見つけることができなかった HBox を追加したので、代わりに新しいコンポーネントに HGroup を追加しました。カスタムコンポーネントの親コンポーネントでフェッチされたデータを使用したい場合、エラーが発生します。コードとそのファイル名は次のとおりです。

ファイル: SearchHomeView.mxml

<?xml version="1.0" encoding="utf-8"?>    
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"    
        xmlns:s="library://ns.adobe.com/flex/spark" title="Twitter Search">    
    <fx:Declarations>    
        <!-- Place non-visual elements (e.g., services, value objects) here -->    
        <s:HTTPService result="onResult(event)" id="service" url="http://search.twitter.com/search.atom?q=adobe">

        </s:HTTPService>    
    </fx:Declarations>    
    <fx:Script>    
        <![CDATA[    
            import flash.utils.flash_proxy;                       
            import mx.collections.ArrayCollection;    
            import mx.rpc.events.ResultEvent;         

            [Bindable]

            private var ac:ArrayCollection;                       
            private function onResult(event:ResultEvent):void    
            {    
                ac = event.result.feed.entry as ArrayCollection;    
                trace(data);    
                trace(ac);    
            }

            private function doSearch(event:MouseEvent):void    
            {    
                //service.url = "http://search.twitter.com/search.atom?q=" + tearch.text;    
                service.url = "http://search.twitter.com/search.atom?q=adobe";    
                service.send();    
            }    
        ]]>    
    </fx:Script>

    <s:TextInput x="25" y="26" width="146" id="tearch"/>    
    <s:Button x="224" y="26" height="33" label="Search" click="doSearch(event)" />    
    <s:List dataProvider="{ac}" itemRenderer="tweet" x="25" y="92" width="274" height="278"></s:List>    
</s:View>

ファイル: tweet.mxml

    <?xml version="1.0" encoding="utf-8"?>        
    <s:HGroup xmlns:fx="http://ns.adobe.com/mxml/2009"        
              xmlns:s="library://ns.adobe.com/flex/spark" width="400" height="300">        
        <fx:Declarations>        
            <!-- Place non-visual elements (e.g., services, value objects) here -->

        </fx:Declarations>        
        <s:Image width="50" height="50" source="{parentDocument.data.link.getItemAt('1').href}">

        </s:Image>        
        <s:TextBase width="100%" text="">                               
        </s:TextBase>        
    </s:HGroup>

source to be を使用するとsource="{parentDocument.data.link.getItemAt('1').href}、エラーは削除されますが、結果のアプリには何も表示されません。

source を使用するとsource="{data.link[1].href}...エラーが発生し、

この行に複数のマーカー:

-1120: 未定義のプロパティ データへのアクセス。
-parentDocument

カスタム コンポーネントでアイテム レンダラーを使用するには、何をする必要がありますか? 解決策を教えてください...私はかなりの時間それに固執しています。

4

2 に答える 2

3

コンポーネントはItemRendererTweet.mxmlを拡張する必要があります。

Flex 3 では、多くのコンポーネントをアイテム レンダラーとして使用できますHBox。ビデオで見た古い (Flex 3) コンポーネントは、dataプロパティを持つアイテム レンダラーとして機能します。

Flex 4 の「従量制」アプローチの一環として、コンテナー クラス (Group、HGroup など) は、アイテム レンダラーとして直接使用することをサポートしていません。その結果、プロパティHGroupがありません。data

Tweet.mxml次のようにしてみてください。

<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009"
    xmlns:s="library://ns.adobe.com/flex/spark" width="400" height="300">

    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

    <s:layout>
        <s:HorizontalLayout />
    </s:layout>

    <!-- Typically, the dataProvider of your List is an array of objects of the same
         type. So each item renderer that is on screen has it's data property populated
         with one of these items. You can then craft an MXML document like this that
         uses the properties of your array element. You're going to need to use the
         right expression that finds the image source in the data item. If you really
         want to be rendering the array data.link, pass that data w/an ArrayCollection
         to the list instead ... it's hard to advise here w/out knowing what your data
         looks like. -->
    <s:Image width="50" height="50" source="{data.link.getItemAt('1').href}" />

    <s:StyleableTextField width="100%" text="" />

</s:ItemRenderer>

私が行っている変更は次のとおりです。

  • ItemRenderer を拡張する
  • レンダラーで Horizo​​ntalLayout を使用して HGroup のレイアウトを置き換えます
  • 画像のソースにレンダラーのデータ プロパティを使用する (データ プロパティを使用して、レンダラーのすべての動的部分 (テキスト フィールドなど) を設定します)
  • StyleableTextField を使用して、モバイル用に最適化されたテキスト
于 2012-05-04T04:59:24.613 に答える
0

onResult イベント ハンドラーで - 実際にすべてのアイテムを arraycollection に割り当てていることを確認してください - feed.entry が明示的に ArrayCollection でない場合は、リストを反復処理する必要があります (RSS フィードのように見えるため、これを xmllist と仮定します) )...

代わりに:

protected function onResult(event:ResultEvent):void
{
    if (!ac) ac = new ArrayCollection();
    for each (var entry:XML in event.result.feed..entry)
    {
        ac.addItem(entry);
    }
}

ItemRenderer に関しては、いくつかの異なるオプションがあります...

  1. ItemRenderer - @Sunil で提案されているように、これは、spark ベースのリストで使用するレンダラーの「基本」クラスです。
  2. DataGroup - これは、レイアウトを指定するグループに似ていますが、「レンダラー」を作成します - データプロバイダーを使用して「データ」プロパティを持つものは何でも作成します。
  3. DataGrid に切り替えると、これよりも複雑になります...
于 2012-05-04T15:13:19.583 に答える