2012-05-08 12 views
0

私はデータベースにユーザーの生年月日を含めていますが、年齢を表示する必要があります。私は年齢を計算する関数を持っていますが、ItemRendererでは使用できませんし、理由もわかりません。このコードをItemRendererの外で使用するとうまくいくとは思えません。 DOBは{data.dob}によってアクセスされます。ここでAdob​​e Flex ItemRenderer:計算する

は私のコードです:

<s:GridColumn dataField="age" headerText="Age" width="80"> 
        <s:itemRenderer> 
         <fx:Component> 
          <s:GridItemRenderer> 
           <fx:Script> 
            <![CDATA[ 
             // Retrieving the user's DOB 
             var dateStr:String = "{data.dob}"; 
             //Splitting the DOB up to make it compatible with Flex 
             var parts:Array = dateStr.split("-"); 

             if(parts == null || parts.length != 3) 
             { 
              Alert.show("There is an error retrieving the birthday."); 
             } 

             var dobDay:* = parts[2]; 
             var dobMonth:* = parts[1] - 1; 
             var dobYear:* = parts[0]; 

             var userDOB : Date = new Date(dobYear, dobMonth, dobDay); 
             var today : Date = new Date(); 

             var diff : Date = new Date(); 
             diff.setTime(today.getTime() - userDOB.getTime()); 

             var userAge : int = diff.getFullYear() - 1970; 
            ]]> 
           </fx:Script> 
           <s:Label id="ageLbl" text="userAge" /> 
          </s:GridItemRenderer> 
         </fx:Component> 
        </s:itemRenderer> 
       </s:GridColumn>` 

最初に私はそう、私はvar dateStr:String = "{data.dob}";にそれを変更するとエラーが1120: Access of Undefined property Alertに移行var dateStr:String = {data.dob};ため#1084エラーを取得しました。私も同じエラーがあった:diff, parts, today, userAge, userDOB。 アイデアはありますか?私が言ったように、コードはItemRendererの外で、ただ1つのDOBを使って動作します。

+0

は、この 'VARの関数datestrのように使用してみてください:文字列= data.dob;' – Exhausted

答えて

0

はこれを試してみてください:

<s:DataGrid x="71" y="58" width="490" height="264" requestedRowCount="4"> 
    <s:columns> 
     <s:ArrayList> 
      <s:GridColumn dataField="dataField1" headerText="Column 1"></s:GridColumn> 
      <s:GridColumn dataField="dataField2" headerText="Column 2"></s:GridColumn> 
      <s:GridColumn dataField="dob" headerText="Age" width="80"> 
       <s:itemRenderer> 
        <fx:Component> 
         <s:GridItemRenderer> 
          <fx:Script> 
           <![CDATA[ 
            import mx.controls.Alert; 

            override public function prepare(hasBeenRecycled:Boolean):void { 

             if(data!=null) 
             { 
              trace(data.dob); 

              // Retrieving the user's DOB 
              var dateStr:String = data.dob; 
              //Splitting the DOB up to make it compatible with Flex 
              var parts:Array = dateStr.split("-") ; 

              if(parts == null || parts.length != 3) 
              { 
               Alert.show("There is an error retrieving the birthday."); 
              } 

              var dobDay:* = parts[2]; 
              var dobMonth:* = parts[1] - 1; 
              var dobYear:* = parts[0]; 

              var userDOB : Date = new Date(dobYear, dobMonth, dobDay); 
              var today : Date = new Date(); 

              var diff : Date = new Date(); 
              diff.setTime(today.getTime() - userDOB.getTime()); 

              var userAge : int = diff.getFullYear() - 1970; 

              ageLbl.text = userAge.toString(); 
             } 
            } 

           ]]> 
          </fx:Script> 
          <s:Label id="ageLbl" text="userAge" top="7" left="9"/> 
         </s:GridItemRenderer> 
        </fx:Component> 
       </s:itemRenderer> 
      </s:GridColumn> 

     </s:ArrayList> 
    </s:columns> 
    <s:ArrayList> 
     <fx:Object dataField1="data1" dataField2="data1" dob="1990-05-25"></fx:Object> 
     <fx:Object dataField1="data2" dataField2="data2" dob="1981-02-15"></fx:Object> 
     <fx:Object dataField1="data3" dataField2="data3" dob="1956-05-7"></fx:Object> 
     <fx:Object dataField1="data4" dataField2="data4" dob="1994-08-25"></fx:Object> 
    </s:ArrayList> 
</s:DataGrid> 
+0

これがうまく働きました。ありがとうございました。 'public function prepare(hasBeenRecycled:Boolean):void'をオーバーライドするのはどういう意味ですか?私はなぜmxコントロールを再度インポートする必要があるのか​​、関数が何をするのか、 'trace(data.dob)'が何をするのか理解していません。私はあなたの答えを正しいとマークしました。 – user1077544

+0

prepare()メソッドをオーバーライドして、ビジュアル特性の変更やイベントハンドラのアタッチなど、ディスプレイの最終変更を行うことができます。 traceはdata.dobをトレースして、どのDOBデータitemRendererが動作しているのか、dateStrにあるものを見ることができます。 itemRenderersの詳細については、http://help.adobe.com/jp/flex/using/WS0ab2a460655f2dc3-427f401412c60d04dca-7ff3.htmlからご覧ください。 – Nemi

0

インラインアイテムレンダラーを使用しています。インラインレンダラーは、外部レンダラーを外部ファイルと同じように考えてください。それを使用するには、mx.controls.Alertを再インポートする必要があります。さらに、メインのアプリケーション変数をitemRendererの内部から呼び出す場合は、メインアプリケーションで変数をpublic変数にする必要があります。

関連する問題