Flex 4 - 如何使用NumericStepper过滤器?

时间:2014-03-01 09:38:02

标签: actionscript-3 flex flex4

我有一个包含员工详细信息的XML文件。我必须使用过滤器。在这里,我想使用两个NumericStepper过滤体验。如果我为第一个和第二个NumericStepper选择1和4,DataGrid将显示员工列表,该列表是员工经历的1到4之间。

这是我的代码:

    <fx:Script>
    <![CDATA[
        import mx.controls.Alert;
        import mx.events.FlexEvent;
        import mx.utils.ObjectUtil;

        private function xmlListCollectionFilterFun(item : Object) : Boolean
        {
            if(employeeName.text.length !=0)
            {
                if((item.Name).toLowerCase().indexOf(employeeName.text.toLowerCase())!= -1)
                {
                    return true;
                }
            }
            if(employeeID.text.length != 0)
            {
                if((item.Id).toLowerCase().indexOf(employeeID.text.toLowerCase()) != -1)
                {
                    return true;
                } 
            }

            if(endYear.value != 0)
            {
                if((startYear.value)<=(item.Experience)<=(endYear.value))
                {
                    return true;
                }
            } 

            return false;
        }

        protected function employeeText_changeHandler():void
        {
            if( employeeName.text.length == 0 && endYear.value == 0 &&
                employeeID.text.length == 0 )
            {
                employeeXMLList.filterFunction = null;
            }
            else
            {
                employeeXMLList.filterFunction = xmlListCollectionFilterFun;
            }
            employeeXMLList.refresh();

        }

    ]]>
</fx:Script>


<fx:Declarations>

    <fx:XML id="tempXML"
            source="skins/TextXmlFile.xml" />

    <s:XMLListCollection id="employeeXMLList"
                         source="{tempXML.Employee}" filterFunction="xmlListCollectionFilterFun"/>
</fx:Declarations>

<s:layout>
    <s:VerticalLayout verticalAlign="top" horizontalAlign="center" paddingTop="30"/>
</s:layout>
<mx:VBox width="100%">
    <s:HGroup width="100%">
        <s:TextInput id="employeeName" change="employeeText_changeHandler()" prompt="Employee Name"/>
        <s:TextInput id="employeeID" prompt="Employee ID" change="employeeText_changeHandler()"/>
        <s:NumericStepper id="startYear" minimum="0" maximum="50" snapInterval="1" />
        <s:NumericStepper id="endYear" minimum="0" maximum="50" snapInterval="1" change="employeeText_changeHandler()"/>
    </s:HGroup>
    <s:DataGrid id="dataGrid" dataProvider="{employeeXMLList}" width="100%" height="100%">
        <s:columns>
            <s:ArrayCollection>
                <s:GridColumn id="nameCol" dataField="Name" headerText="Name:"/>
                <s:GridColumn id="idCol" dataField="Id" headerText="ID:"/>
                <s:GridColumn id="experienceCol" dataField="Experience" headerText="Experience:"/>
            </s:ArrayCollection>
        </s:columns>
    </s:DataGrid>

这是代码对NumericStepper无效。如果有人能找到我的错误?

2 个答案:

答案 0 :(得分:0)

这是你的代码中的拼写错误还是堆栈溢出问题没有显示一些字符(我假设的OR管道)?

employeeName.text.length == 0 endYear.value == 0 &&
            employeeID.text.length == 0

更新:即使使用管道,此测试也没有意义。

答案 1 :(得分:0)

尝试始终将代码拆分为只做一件事的小函数,我会这样做:

 getUserExperience(user:Object):Number

实现此功能首先做一些测试,然后在获得它之后返回正确的经验,然后你可以进入下一步来制作过滤功能。

编写一些代码来计算过滤器的最小和最大体验

var min:Number=startYear.value;
var max:Number=endYear.value;//if needed adjust this to seome default values

现在过滤应该很简单,因为你只有数字,没有UI组件和对象 所以过滤器需要检查一个简单的事情

var userExp:Number=getUserExperience(user);
var response:Boolean=mio<=userExp&&userExp<=max;

return response;

我确信在您重构代码之后,只需简单明了就可以轻松修复任何错误