2013-06-14 18 views
10

Bạn sẽ đặt hàng danh sách các mục trong AngularJS theo thứ tự ngẫu nhiên như thế nào? Tôi đã nghĩ rằng bộ lọc tích hợp sẵn trong orderBy sẽ hoạt động nhưng tôi không chắc chắn cách thức mà không thêm một số dữ liệu bổ sung vào mô hình. Một cái gì đó như sẽ là tuyệt vời.Sử dụng AngularJS làm cách nào tôi có thể ngẫu nhiên hóa thứ tự của một bộ sưu tập?

item in items | orderBy:random 

Ý tưởng tiếp theo của tôi là tạo bộ lọc tùy chỉnh nhưng tôi muốn tránh điều đó nếu có điều gì đó tốt hơn đã có sẵn.

+4

Không phải là chuyên gia về Góc, nhưng bộ lọc có thể được đánh giá bất cứ lúc nào và sẽ tiếp tục xáo trộn các mục mọi lúc. Bạn có thể muốn thêm thuộc tính "ngẫu nhiên" vào các mục khi chúng được tải và sắp xếp theo thuộc tính đó. – Dogbert

+0

@Dogbert có quyền của nó. Trong các phiên bản hiện tại của AngularJS, câu trả lời [được chấp nhận bên dưới] (http://stackoverflow.com/a/17102267/901048) tạo ra các lỗi 'infdig' trong bảng điều khiển, bởi vì việc sắp xếp được lặp lại cho đến khi cùng một thứ tự được tạo ra hai lần. Xem [câu hỏi này] (http://stackoverflow.com/questions/21586369/random-orderby-in-angularjs-1-2-returns-infdig-errors). – Blazemonger

Trả lời

17

orderBy có thể mất một số chức năng, giống như array.sort vì vậy bạn có thể sử dụng HTML phía trên và xác định một hàm random trên phạm vi như:

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

này sẽ trả về một giá trị ngẫu nhiên đôi khi tiêu cực, đôi khi tích cực, đôi khi 0, sẽ sắp xếp ngẫu nhiên mảng.

+0

Nhưng giá trị sẽ không nhất quán (có nghĩa là bạn có thể thấy rằng đôi khi 'a SJuan76

+0

Sẵn sàng nhận xét ban đầu của tôi. Nếu mỗi phép so sánh là ngẫu nhiên, bạn có thể kết thúc bằng 'a c' và bạn phải đảm bảo rằng thuật toán sắp xếp có thể xử lý (trên thực tế, nó không khớp với định nghĩa 'thứ tự'). Nhận xét của Dogbert vạch ra một phương pháp để sắp xếp ngẫu nhiên khi thứ tự là ngẫu nhiên và nhất quán trong suốt quá trình chạy. – SJuan76

+0

Rất vui khi nó hoạt động cho bạn. Bạn không cần phải sử dụng parens để gọi nó, kiểm tra fiddle từ @owenmead bên dưới. – sh0ber

6

Làm một phương pháp fiddle sh0ber nhanh dường như làm việc tốt: 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 góc của sử dụng loại JavaScript của() trên một bản sao của danh sách. Nhìn vào một câu trả lời khác, các trình duyệt nhất định ổn định trong sắp xếp của chúng, những trình duyệt khác thì không. Có lẽ chỉ cần kiểm tra fiddle trong một vài trình duyệt và bạn nên làm tốt: Array.sort Sorting Stability in Different Browsers

PS. Không thể nhận xét về câu trả lời của sh0ber vì tôi không có 50 đại diện

+9

FYI - điều này gây ra 'Lỗi: [$ rootScope: infdig]' –

+1

cho 'Lỗi: [$ rootScope: infdig] 'Điều này xảy ra trong các phiên bản sau của góc nơi mà chu trình tiêu hóa thực hiện hàm ngẫu nhiên hai lần và kết quả không phù hợp với nó (do đó tạo ra chu trình phân hủy vô hạn hoặc" infdig ") –

+1

Một lưu ý về điểm @ DavidAnderton (rất hữu ích). Tôi nhận ra rằng tôi đã có hai trường số được chọn ngẫu nhiên và đã ném lỗi. Tôi đã thêm một 'track by model.id' và nó hiện đang hoạt động rất tốt. – cchapman

Các vấn đề liên quan