OK, je trie un xmlistCollection dans l'ordre alphabétique. J'ai cependant un problème. Si la valeur est "tout", je veux que cela soit d'abord dans la liste. Dans la plupart des cas, cela arrive déjà mais les valeurs qui sont des chiffres sont triées avant «tout». Je veux "tout" pour toujours être la première sélection de mon DataProvider, puis le reste alphabétique.
Alors j'essaie d'écrire ma propre fonction de tri. Existe-t-il une façon de vérifier si l'une des valeurs est tout, et si ce n'est pas le dire à la comparaison régulière sur les valeurs? P>
Voici ce que j'ai: P>
function myCompare(a:Object, b:Object, fields:Array = null):int { if(String(a).toLowerCase() == 'all') { return -1; } else if(String(b).toLowerCase() == 'all') { return 1; } // NEED to return default comparison results here? } //------------------------------ var sort:Sort = new Sort(); sort.compareFunction = myCompare;
4 Réponses :
Eh bien, j'ai essayé quelque chose, et je suis vraiment surpris que cela ait effectivement fonctionné, mais voici ce que j'ai fait.
La classe de tri a une fonction privée appelée internalcompare. Comme il est privé, vous ne pouvez pas l'appeler. Mais il y a une fonction getter appelée comparerfunction, et si aucune fonction de comparaison n'est définie, il renvoie une référence à la fonction interneCompare. Donc, ce que j'ai fait était de recevoir cette référence puis de l'appeler. P>
Vous pouvez également être capable de faire F une instance ou un membre statique de la classe, de sorte que vous ne devez donc pas créer de nouveau type chaque fois qu'un comparateur est effectué.
La solution de John Isaacks est géniale, mais il a oublié une variable "champs" et son exemple ne fonctionne pas pour des objets plus compliqués (autres que des cordes)
Exemple: P>
// collection with custom objects. We want to sort them on "value" property // var item:CustomObject = new CustomObject(); // item.name = 'Test'; // item.value = 'Simple Value'; var collection:ArrayCollection = new ArrayCollection(); var s:Sort = new Sort(); s.fields = [new SortField("value")]; s.compareFunction = myCompare; collection.sort = s; collection.refresh(); private function myCompare(a:Object, b:Object, fields:Array = null):int { if(String((a as CustomObject).value).toLowerCase() == 'all') { return -1; } else if(String((b as CustomObject).value).toLowerCase() == 'all') { return 1; } // NEED to return default comparison results here? var s:Sort = new Sort(); s.fields = fields; var f:Function = s.compareFunction; return f.call(null,a,b,fields); }
À première vue, je pensais que vous aviez tort mais s'avère que Adobe a réussi à bousiller une fois de plus. Leur fonction interneCompare vérifie les champs d'instance au lieu du paramètre de fonction. Encore un autre des gemmes d'Adobe ...
C'était très utile. J'ai essayé d'utiliser String.Localecompare (), mais cela a des effets secondaires méchants du tri trop souvent
Merci gars, cela a beaucoup aidé beaucoup. Dans notre cas, nous avions besoin de toutes les lignes vides (dans un DataGrid) en bas. Toutes les lignes non vides doivent être triées normalement. Nos données de ligne sont tous des objets dynamiques (convertis de JSON) - l'appel à validationhelper.hasdata () vérifie simplement si la ligne est vide. Pour une raison quelconque, les champs contiennent parfois la valeur de chaîne de Datafield au lieu de champs de tri, d'où la vérification avant de définir la propriété "champs":
Je n'ai pas trouvé ces approches pour travailler pour ma situation, qui visait à alphabétiser une liste de chaînes puis appendez un article "Créer de nouveau ..." à la fin de la liste.
La façon dont j'ai manipulé Les choses sont un peu inélégantes, mais fiables. p>
J'ai trié mon arraycollection code> de chaînes, appelé
if(userIsAllowedToCreateNewCustomer)
{
customerDataList.addItem(CREATE_NEW);
customerDataList.refresh();
}
Je voudrais dire que cela n'arriverait jamais. Mais oui je sais que ce n'est jamais le cas lol. J'ajouterai une autre instruction si une déclaration avant la main pour vérifier qu'ils sont les mêmes et le retour 0 est vrai. Merci.