เรียงลำดับจากมากไปน้อยตามตัวกรองวันใน AngularJs


139
<div class="recent" ng-repeat="reader in
    (filteredItems = (book.reader | orderBy: 'created_at' | limitTo: 1))">
</div>

ดังนั้นหนังสือมาจากส่วนที่เหลือ api และมีผู้อ่านจำนวนมากที่แนบมา ฉันต้องการรับผู้อ่าน 'ล่าสุด'

created_atข้อมูลมีค่าที่ระบุผู้ใช้เป็นที่ผ่านมา แต่รหัสด้านบนทำให้ฉันเป็นผู้อ่านที่เก่าแก่ที่สุด ดังนั้นคำสั่งจะต้องมีการผกผัน? มีวิธีการเรียงลำดับจากมากไปน้อยบ้างไหม?

คำตอบ:


219

ตามเอกสารคุณสามารถใช้reverseอาร์กิวเมนต์

filter:orderBy(array, expression[, reverse]);

เปลี่ยนตัวกรองของคุณเป็น:

orderBy: 'created_at':true

21
โปรดสังเกตว่า:ไม่ใช่เครื่องหมายจุลภาค (สำหรับคนที่ไม่ใช่คนสังเกต)
ReactiveRaven

1
หากคุณต้องการปุ่มเรียงคุณสามารถแทนที่จริงด้วย sortDirection จากนั้นในขอบเขตของคุณให้ตั้งค่า $ scope.sortDirection = true ปุ่มคลิกจะมีลักษณะเป็น ng-click = "sortDirection =! sortDirection"
mbokil

1
สิ่งเหล่านี้ใช้ได้เฉพาะกับหน้าเว็บที่มีข้อมูลตารางครบถ้วนในหน้าเดียว แต่มันจะไม่ทำงานสำหรับการให้เลขหน้า ..
ANK

ลิงก์ไปยังเอกสารประกอบเสียหาย
robert

180

คุณสามารถใส่คำนำหน้าorderByด้วยเครื่องหมาย '-' เพื่อเรียงลำดับจากมากไปน้อยแทนที่จะเรียงจากน้อยไปหามาก ฉันจะเขียนแบบนี้:

<div class="recent" 
   ng-repeat="reader in book.reader | orderBy: '-created_at' | limitTo: 1">
</div>

นี้ยังเป็นที่ระบุไว้ในเอกสารสำหรับกรองorderBy


6
ขอบคุณนี่เป็นวิธีที่ง่ายและรวดเร็วในการกลับคำสั่งซื้อ
LukeP

41

บางทีนี่อาจเป็นประโยชน์สำหรับใครบางคน:

ในกรณีของฉันฉันได้รับชุดของวัตถุแต่ละชุดประกอบด้วยวันที่ที่ Mongoose กำหนด

ฉันใช้:

ng-repeat="comment in post.comments | orderBy : sortComment : true"

และกำหนดฟังก์ชั่น:

$scope.sortComment = function(comment) {
    var date = new Date(comment.created);
    return date;
};

สิ่งนี้ใช้ได้สำหรับฉัน


1
ขอบคุณ. วันที่ของฉันคือสตริงที่ป้อนในรูปแบบ MMMM dd, YYYY และฉันไม่สามารถหาวิธีการจัดเรียงมุมให้ถูกต้องเว้นแต่ว่าฉันใช้วิธีที่สร้างวัตถุวันที่ ทำงานเหมือนจับใจ
Zargoon

นี่เป็นวิธีที่ถูกต้อง .. เราสามารถใช้วิธีนี้ในรูปแบบวันที่ใดก็ได้ .. ขอบคุณนาย
Jethik

17

และตัวอย่างรหัส:

<div ng-app>
    <div ng-controller="FooController">
        <ul ng-repeat="item in items | orderBy:'num':true">
            <li>{{item.num}} :: {{item.desc}}</li>
        </ul>
    </div>
</div>

และ JavaScript:

function FooController($scope) {
    $scope.items = [
        {desc: 'a', num: 1},
        {desc: 'b', num: 2},
        {desc: 'c', num: 3},
    ];
}

จะให้คุณ:

3 :: c
2 :: b
1 :: a

ใน JSFiddle: http://jsfiddle.net/agjqN/


7

เรียงตามวันที่

มันจะช่วยกรองระเบียนด้วยวันที่ในลำดับถัดลงมา

$scope.logData = [
            { event: 'Payment', created_at: '04/05/17 6:47 PM PST' },
            { event: 'Payment', created_at: '04/06/17 12:47 AM PST' },
            { event: 'Payment', created_at: '04/05/17 1:50 PM PST' }
        ]; 

<div ng-repeat="logs in logData | orderBy: '-created_at'" >
      {{logs.event}}
 </div>

2

ในกรณีของฉัน orderBy จะถูกกำหนดโดยกล่องที่เลือก ฉันชอบการตอบสนองของลุดวิกเพราะคุณสามารถกำหนดทิศทางการเรียงในตัวเลือกที่เลือกเช่น:

        $scope.options = [
            { label: 'Title', value: 'title' },
            { label: 'Newest', value: '-publish_date' },
            { label: 'Featured', value: '-featured' }
        ]; 

มาร์กอัป:

<select ng-model="orderProp" ng-options="opt as opt.label for opt in options"></select>
<ul>
    <li ng-repeat="item in items | orderBy:orderProp.value"></li>
</ul>

1
ดูเหมือนว่านี่จะไม่ทำงานกับฟังก์ชันการเรียงลำดับที่กำหนดเอง มีวิธีย้อนกลับเรียงลำดับเมื่อใช้ฟังก์ชัน orderBy ที่กำหนดเองและเลือกพารามิเตอร์ที่จะเรียงลำดับโดยจาก <select> เหมือนในตัวอย่างของคุณหรือไม่
cre8value

0

ดูตัวอย่าง w3schools: https://www.w3schools.com/angular/angular_filters.asp https://www.w3schools.com/angular/tryit.asp?filename=try_ng_filters_orderby_click

จากนั้นเพิ่มการตั้งค่าสถานะ "ย้อนกลับ":

<!DOCTYPE html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
<body>

<p>Click the table headers to change the sorting order:</p>

<div ng-app="myApp" ng-controller="namesCtrl">

<table border="1" width="100%">
<tr>
<th ng-click="orderByMe('name')">Name</th>
<th ng-click="orderByMe('country')">Country</th>
</tr>
<tr ng-repeat="x in names | orderBy:myOrderBy:reverse">
<td>{{x.name}}</td>
<td>{{x.country}}</td>
</tr>
</table>

</div>

<script>
angular.module('myApp', []).controller('namesCtrl', function($scope) {
    $scope.names = [
        {name:'Jani',country:'Norway'},
        {name:'Carl',country:'Sweden'},
        {name:'Margareth',country:'England'},
        {name:'Hege',country:'Norway'},
        {name:'Joe',country:'Denmark'},
        {name:'Gustav',country:'Sweden'},
        {name:'Birgit',country:'Denmark'},
        {name:'Mary',country:'England'},
        {name:'Kai',country:'Norway'}
        ];

    $scope.reverse=false;
    $scope.orderByMe = function(x) {

        if($scope.myOrderBy == x) {
            $scope.reverse=!$scope.reverse;
        }
        $scope.myOrderBy = x;
    }
});
</script>

</body>
</html>

0

ช่วงเวลาการใช้งานที่แนะนำของฉัน () นั้นง่ายต่อการจัดการวันที่หากเป็นค่าสตริง

//controller
$scope.sortBooks = function (reader) {
            var date = moment(reader.endDate, 'DD-MM-YYYY');
            return date;
        };

//template

ng-repeat="reader in book.reader | orderBy : sortBooks : true"

0

var myApp = angular.module('myApp', []);

myApp.filter("toArray", function () {
    return function (obj) {
        var result = [];
        angular.forEach(obj, function (val, key) {
            result.push(val);
        });
        return result;
    };
});


myApp.controller("mainCtrl", function ($scope) {

  $scope.logData = [
              { event: 'Payment', created_at: '10/10/2019 6:47 PM PST' },
              { event: 'Payment', created_at: '20/10/2019 12:47 AM PST' },
              { event: 'Payment', created_at: '30/10/2019 1:50 PM PST' }
          ]; 
        
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>

<div ng-app="myApp" ng-controller="mainCtrl">

  <h4>Descending</h4>
  <ul>
    <li ng-repeat="logs in logData | toArray | orderBy:'created_at':true" >
          {{logs.event}} - Date : {{logs.created_at}}
    </li>
  </ul>
  
  <br>
  
  
  <h4>Ascending</h4>
  <ul>
    <li ng-repeat="logs in logData | toArray | orderBy:'created_at':false" >
          {{logs.event}} - Date : {{logs.created_at}}
    </li>
  </ul>
  
</div>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.