2016-03-18 4 views
-1

Следующее работает, как и ожидалось, с помощью функции сравнения сортировки, но если я не установил нисходящее значение true.Сортировка arraycollection по нескольким свойствам с использованием sortfield не работает должным образом

var dataSortField:SortField = new SortField("y", false, false, true); 
var dataSortField2:SortField = new SortField("x", false, true, true); 

dataSortField2.compareFunction = 
    function sort(item1:Object, item2:Object):int { 
     return -1 * (ObjectUtil.numericCompare(item1.x, item2.x)); 
    } 

Может ли кто-нибудь сказать мне, почему?

+0

Что вы имеете в виду под "не [работа]"? Происходит ли ошибка времени выполнения/компиляции или вы получаете неожиданный результат? Предоставленная вами информация позволяет нам угадать, что может решить вашу проблему. –

+0

Я имею в виду, что сортировка не выполняется на свойстве x. –

ответ

0

Вам не нужно использовать истинную или ложные для возрастанию/по убыванию, потому что у вас есть обычай compareFunction. Вот основной пример того, как вы можете его использовать.

<?xml version="1.0"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"> 
<fx:Script><![CDATA[ 
    import mx.collections.ArrayCollection; 
    import mx.utils.ObjectUtil; 
    import spark.collections.Sort; 
    import spark.collections.SortField; 

    private var arrayCollection:ArrayCollection = new ArrayCollection([ 
     {x:5, Name:"Adam Lee"}, 
     {x:2, Name:"Bryan Hobb"}, 
     {x:3, Name:"Claudia Toledo"}, 
     {x:7, Name:"Matt Brill"}, 
     {x:8, Name:"Justin Hinz"}, 
     {x:4, Name:"Bikram Dangol"} 
    ]) 

    private function onAscendingButtonClick():void 
    { 
     var dataSortField2:SortField = new SortField(); 
     dataSortField2.compareFunction = sortAscendingCompareFunction; 
     arrayCollection.sort = new Sort(); 
     arrayCollection.sort.fields = [dataSortField2]; 
     arrayCollection.refresh(); 
    } 

    private function sortAscendingCompareFunction(item1:Object, item2:Object):int 
    { 
     return ObjectUtil.numericCompare(item1.x, item2.x); 
    } 

    private function sortDesscendingCompareFunction(item1:Object, item2:Object):int 
    { 
     return ObjectUtil.numericCompare(item2.x, item1.x); 
    } 

    private function onDescendingButtonClick():void 
    { 
     var dataSortField2:SortField = new SortField(); 
     dataSortField2.compareFunction = sortDesscendingCompareFunction; 
     arrayCollection.sort = new Sort(); 
     arrayCollection.sort.fields = [dataSortField2]; 
     arrayCollection.refresh(); 
    } 
    ]]> 
</fx:Script> 
<s:VGroup verticalCenter="0" horizontalCenter="0"> 
    <s:HGroup> 
     <s:Button label="Sort Ascending" click="{onAscendingButtonClick()}"/> 
     <s:Button label="Sort Descending" click="{onDescendingButtonClick()}"/> 
    </s:HGroup> 
    <s:Panel title="Sort using compareFunction" width="100%" backgroundColor="green"> 
     <s:DataGrid dataProvider="{arrayCollection}" sortableColumns="false" width="100%"/> 
    </s:Panel> 
</s:VGroup> 
</s:Application> 

Custom Sort

+0

Да, я это понимаю. То, что я пытаюсь сделать, так это то, что функция сравнения сортировки не нужна. Если я удалю функцию сравнения сортировки, поля сортировки должны по-прежнему работать на основе третьего параметра конструктора, но это не так. –

0

Если вы не хотите использовать пользовательские compareFunction, то это, как вы могли бы достичь восходящий/нисходящий особенность:

<?xml version="1.0"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark"> 
<fx:Script><![CDATA[ 
    import mx.collections.ArrayCollection; 
    import mx.utils.ObjectUtil; 
    import spark.collections.Sort; 
    import spark.collections.SortField; 

    private var arrayCollection:ArrayCollection = new ArrayCollection([ 
     {x:5, Name:"Adam Lee"}, 
     {x:2, Name:"Bryan Hobb"}, 
     {x:3, Name:"Claudia Toledo"}, 
     {x:7, Name:"Matt Brill"}, 
     {x:8, Name:"Justin Hinz"}, 
     {x:4, Name:"Bikram Dangol"} 
    ]) 

    private function onAscendingButtonClick():void 
    { 
     var dataSortField2:SortField = new SortField("x", false, true); 
     //dataSortField2.compareFunction = sortAscendingCompareFunction; 
     arrayCollection.sort = new Sort(); 
     arrayCollection.sort.fields = [dataSortField2]; 
     arrayCollection.refresh(); 
    } 

    private function sortAscendingCompareFunction(item1:Object, item2:Object):int 
    { 
     return ObjectUtil.numericCompare(item1.x, item2.x); 
    } 

    private function sortDesscendingCompareFunction(item1:Object, item2:Object):int 
    { 
     return ObjectUtil.numericCompare(item2.x, item1.x); 
    } 

    private function onDescendingButtonClick():void 
    { 
     var dataSortField2:SortField = new SortField("x", true, true); 
     //dataSortField2.compareFunction = sortDesscendingCompareFunction; 
     arrayCollection.sort = new Sort(); 
     arrayCollection.sort.fields = [dataSortField2]; 
     arrayCollection.refresh(); 
    } 
    ]]> 
</fx:Script> 
<s:VGroup verticalCenter="0" horizontalCenter="0"> 
    <s:HGroup> 
     <s:Button label="Sort Ascending" click="{onAscendingButtonClick()}"/> 
     <s:Button label="Sort Descending" click="{onDescendingButtonClick()}"/> 
    </s:HGroup> 
    <s:Panel title="Sort without compareFunction" width="100%" backgroundColor="green"> 
     <s:DataGrid dataProvider="{arrayCollection}" sortableColumns="false" width="100%"/> 
    </s:Panel> 
</s:VGroup> 
</s:Application> 
+0

Если я просто передаю первое поле, оно работает. То, что я пытаюсь сделать, это передать два поля сортировки и установить первый в восходящем, а второй - на нисходящий. Первое поле сортировки работает так, как ожидалось, но второе поле сортировки не работает. –

0

Похоже, что вы хотите использовать несколько SortField. Первая сортировка по первым Поле в по возрастанию заказ. Если они такие же, то сортировать по второму Поле в по убыванию заказать. Если вы используете compareFunction, это становится приоритетом. В вашем случае не используйте compareFunction, поскольку вы используете по убыванию как true для SortFieldx. Ниже приведен пример:

<?xml version="1.0"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark"> 
<fx:Script><![CDATA[ 
    import mx.collections.ArrayCollection; 
    import spark.collections.Sort; 
    import spark.collections.SortField; 

    private var arrayCollection:ArrayCollection = new ArrayCollection([ 
     {x:3, Name:"Claudia Toledo"}, 
     {x:5, Name:"Adam Lee"}, 
     {x:7, Name:"Adam Lee"}, 
     {x:2, Name:"Bryan Hobb"}, 
     {x:7, Name:"Matt Brill"}, 
     {x:4, Name:"Bikram Dangol"}, 
     {x:4, Name:"Adam Lee"}, 
     {x:9, Name:"Bikram Dangol"}, 
     {x:8, Name:"Justin Hinz"}, 
     {x:2, Name:"Bikram Dangol"} 
    ]); 

    private function onSortButtonClick():void 
    { 
     var dataSortField1:SortField = new SortField("Name", false, false); 
     var dataSortField2:SortField = new SortField("x", true, true); 
     arrayCollection.sort = new Sort(); 
     arrayCollection.sort.fields = [dataSortField1,dataSortField2]; 
     arrayCollection.refresh(); 
    } 


    ]]> 
</fx:Script> 
<s:VGroup verticalCenter="0" horizontalCenter="0"> 
     <s:Button label="Sort Ascending Name and Descending x" click="{onSortButtonClick()}"/> 
    <s:Panel title="Multiple Field Sort" width="100%" backgroundColor="green"> 
     <s:DataGrid dataProvider="{arrayCollection}" sortableColumns="false" width="100%"/> 
    </s:Panel> 
</s:VGroup> 
</s:Application> 

Multiple Sort Example