2012-05-08 110 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>` 

起初我得到一個#1084錯誤var dateStr:String = {data.dob};,所以我把它改成var dateStr:String = "{data.dob}";和錯誤遷移到1120: Access of Undefined property Alert。我也有同樣的錯誤:diff, parts, today, userAge, userDOB。 這裏的任何想法?就像我說的那樣,代碼在ItemRenderer之外工作,只使用一個DOB。

+0

使用這樣的'變種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

這工作得很好;謝謝。 '重寫公共函數準備(hasBeenRecycled:Boolean):void'是什麼意思?我現在明白爲什麼你需要再次導入mx控件,但不是函數做什麼,或者是什麼'trace(data.dob)'。儘管如此,我已經標記了你的答案。 – user1077544

+0

您可以重寫prepare()方法對顯示進行任何最終修改,例如修改其視覺特徵或附加事件處理程序。跟蹤跟蹤data.dob,以便您可以看到DOB數據itemRenderer的工作方式或dateStr中的內容。我建議你閱讀更多有關的itemRenderer,開始在:http://help.adobe.com/en_US/flex/using/WS0ab2a460655f2dc3-427f401412c60d04dca-7ff3.html – Nemi

0

您正在使用內聯項目渲染器。像在外部文件中的項目渲染器一樣,考慮內聯渲染器。您將需要重新導入mx.controls.Alert才能使用它。另外,如果你想從itemRenderer中調用你的主應用程序變量,你需要在你的主應用程序中使它們成爲公共變量。