2013-06-14 3 views
10

Come ordinare un elenco di elementi in AngularJS in ordine casuale? Stavo pensando che il filtro integrato orderBy avrebbe funzionato, ma non sono sicuro di come senza aggiungere alcuni dati aggiuntivi al modello. Qualcosa di simile sarebbe bello.Uso di AngularJS come è possibile randomizzare l'ordine di una raccolta?

Il mio prossimo pensiero è stato quello di creare un filtro personalizzato ma preferirei evitare che se c'è qualcosa di meglio già disponibile.

+4

Non sono un esperto di Angular, ma il filtro potrebbe essere valutato in qualsiasi momento, e continuerebbe a mischiare gli oggetti tutto il tempo. Potresti voler aggiungere una proprietà "casuale" agli elementi quando sono caricati e ordinare per quella proprietà. – Dogbert

+0

@Dogbert ha il diritto di farlo. Nelle versioni correnti di AngularJS, la [risposta accettata in basso] (http://stackoverflow.com/a/17102267/901048) genera errori "infdig" nella console, poiché l'ordinamento viene ripetuto finché lo stesso ordine non viene prodotto due volte. Vedi [questa domanda] (http://stackoverflow.com/questions/21586369/random-orderby-in-angularjs-1-2-returns-infdig-errors). – Blazemonger

risposta

17

orderBy può prendere un parametro di funzione, proprio come array.sort modo da poter utilizzare il codice HTML sopra e definire una funzione random sul campo di applicazione come:

$scope.random = function(){ 
    return 0.5 - Math.random(); 
}; 

Ciò restituirà un valore casuale a volte negativo, a volte positiva, a volte 0, che ordinerà in modo casuale la matrice.

+0

Ma il valore non sarà coerente (significa che potresti trovare che a volte 'a SJuan76

+0

Pronto il mio commento originale. Se ogni confronto è casuale, potresti terminare con 'a c', e dovresti assicurarti che l'algoritmo di ordinamento possa gestirlo (di fatto, non corrisponderebbe alla definizione di 'ordine'). Il commento di Dogbert delinea un metodo per l'ordinamento casuale in cui l'ordine è casuale E coerente durante una corsa. – SJuan76

+0

Felice che abbia funzionato per te. Non dovresti aver bisogno di usare Parens per invocarlo, controlla il violino da @owenmead qui sotto. – sh0ber

6

Facendo un metodo di violino sh0ber rapido sembra funzionare bene: http://jsfiddle.net/owenmead/fa4v8/1/

<div ng-controller="MyCtrl"> 
    <p ng-repeat="i in list|orderBy:random">{{i}}</p> 
</div> 

function MyCtrl($scope) { 
    $scope.list = ['a', 'b', 'c', 'd', 'e', 'f', 'g']; 
    $scope.random = function() { 
    return 0.5 - Math.random(); 
    } 
} 

orderBy di angolare utilizza sorta di JavaScript() su una copia della lista. Guardando un'altra risposta, alcuni browser sono stabili nel loro genere, altri no. Forse prova solo il violino in alcuni browser e dovresti andare: Array.sort Sorting Stability in Different Browsers

PS. Non posso commentare la risposta di sh0ber in quanto non ho 50 rep

+9

FYI - questo sta causando 'Errore: [$ rootScope: infdig]' –

+1

per 'Errore: [$ rootScope: infdig] 'questo succede nelle versioni successive di angular dove il ciclo digest esegue la funzione random due volte e poiché i risultati sono incoerenti riprova (creando così un ciclo di digest infinito o" infdig ") –

+1

Una nota sul punto @ DavidAnderton (che è stato molto utile). Mi sono reso conto che avevo due campi numerici che erano stati randomizzati e che stavano lanciando l'errore. Ho aggiunto una 'traccia di model.id' e ora funziona alla grande. – cchapman

Problemi correlati