การเรียงลำดับดร็อปดาวน์ตัวอักษรใน AngularJS


158

ฉันเติมรายการแบบหล่นลงผ่านการใช้ตัวเลือก ng- ซึ่งติดกับตัวควบคุมที่จะเรียกบริการ น่าเสียดายที่ข้อมูลที่เข้ามามีความยุ่งเหยิงและฉันจำเป็นต้องเรียงลำดับตามตัวอักษร

คุณคิดว่าสิ่งที่ต้องการ$.sortByจะทำ แต่น่าเสียดายที่มันไม่ได้ทำแจ็ค ฉันรู้ว่าฉันสามารถจัดเรียงมันผ่าน javascript ด้วยวิธีผู้ช่วยเหลือfunction asc(a,b)หรืออะไรทำนองนั้น แต่ฉันปฏิเสธที่จะเชื่อว่าไม่มีวิธีที่จะทำความสะอาดได้ดีกว่านี้และฉันไม่ต้องการที่จะขยายตัวควบคุมด้วยวิธีการช่วยเหลือ มันเป็นสิ่งพื้นฐานในหลักการดังนั้นฉันจึงไม่เข้าใจว่าทำไม AngularJS ไม่มีสิ่งนี้

มีวิธีทำบางอย่างเช่น$orderBy('asc')?

ตัวอย่าง:

<select ng-option="items in item.$orderBy('asc')"></select>

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

คำตอบ:


342

เชิงมุมมีorderByกรองที่สามารถนำมาใช้เช่นนี้

<select ng-model="selected" ng-options="f.name for f in friends | orderBy:'name'"></select>

ดูซอนี้เป็นตัวอย่าง

เป็นที่น่าสังเกตว่าหากtrack byมีการใช้งานจะต้องปรากฏขึ้นหลังorderByตัวกรองเช่นนี้

<select ng-model="selected" ng-options="f.name for f in friends | orderBy:'name' track by f.id"></select>

1
ดูซอ (หรือเพิ่มแท็กเลือกการเรียงลำดับในการสอน Angular ToDo) รับตัวเลือกเพื่อแสดงเป็น 'เลือก' - หรือแม้กระทั่งการรับตัวเลือกแรกเพื่อแสดง - เป็นปัญหา ด้วย Angular มันว่างเปล่า?
Dave Everitt

2
@DaveEveritt วิธีหนึ่งในการตั้งค่าเริ่มต้น (และการลบรายการว่าง) คือการเลือกรายการที่ถูกผูกไว้selectedล่วงหน้า $scope.selected = $scope.friends[0]ตัวอย่างเช่นนี้คุณสามารถทำสิ่งที่ชอบ ดูซอนี้สำหรับตัวอย่างการทำงาน
Gloopy

จะทำอย่างไรถ้าฉันต้องการอายุเป็นค่าในการเลือกไม่ใช่องค์ประกอบ JSON ทั้งหมด
Rishi

@ ฤishiษีลองนี้สำหรับตัวเลือก ng: f.age as f.name for f in friends | orderBy:'name'- นี่คือซอทำงาน เพิ่มเติมเกี่ยวกับ NG-ตัวเลือกที่นี่
Gloopy

7
@ ทั่วโลกคำตอบนี้ทำให้ฉัน 90% ของวิธีการที่นั่น คุณจะคิดเพิ่มกรณีเมื่อใช้แทร็กโดยหรือไม่ <select ng-model="selected" ng-options="f.name for f in friends | orderBy:'name' track by f.id"></selected>. การวางtrack byหลังจากตัวกรองคำสั่งซื้อไม่เข้าใจง่ายและคำตอบนี้เป็นผลการค้นหายอดนิยมจาก google
MushinNoShin

26

คุณควรใช้ตัวกรอง: orderBy

orderByสามารถยอมรับตัวเลือกที่สามสำหรับการreverseตั้งค่าสถานะ

<select ng-option="item.name for item in items | orderBy:'name':true"></select>

รายการที่นี่จะถูกจัดเรียงตามคุณสมบัติ 'ชื่อ' ในลำดับที่กลับรายการ อาร์กิวเมนต์ที่ 2 สามารถเป็นฟังก์ชันการเรียงลำดับใดก็ได้เพื่อให้คุณสามารถเรียงลำดับในกฎใดก็ได้

@see http://docs.angularjs.org/api/ng.filter:orderBy


6
หรือเพียง <select ng-option = "item.name สำหรับรายการในรายการ | orderBy: '- name'"> </select> ทำงานเหมือนกัน :)
Mahbub

2
var module = angular.module("example", []);

module.controller("orderByController", function ($scope) {
    $scope.orderByValue = function (value) {
        return value;
    };

    $scope.items = ["c", "b", "a"];
    $scope.objList = [
        {
            "name": "c"
        }, {
            "name": "b"
        }, {
            "name": "a"
        }];
        $scope.item = "b";
    });

http://jsfiddle.net/Nfv42/65/


2
มีข้อความอธิบายว่าสิ่งนี้ตอบคำถามของ OP และ / หรือวิธีที่คุณใช้มันจะมีประโยชน์มากที่นี่
Sean the Bean

@SeantheBean ฉันได้รับการสาธิตซอดังนั้นฉันจึงไม่ได้ให้คำอธิบาย
TechnoCrat

2
@TechnoCrat คำอธิบายจะเป็นที่ต้องการอีกต่อไป ในความเป็นจริงมันจะน่าสนใจโดยเฉพาะอย่างยิ่งที่จะรู้ว่าทำไมการแก้ปัญหานี้จะเป็นที่ต้องการมากกว่าคนที่โพสต์เมื่อปีที่แล้ว หรือว่ามันจะแตกต่างกันอย่างไร ...
Chipowski

@Chipowski ตกลง ต่อไปฉันจะพยายามอธิบายพร้อมคำตอบ
TechnoCrat

0

สำหรับทุกคนที่ต้องการเรียงลำดับตัวแปรในเลเยอร์ที่สาม:

<select ng-option="friend.pet.name for friend in friends"></select>

คุณสามารถทำได้เช่นนี้

<select ng-option="friend.pet.name for friend in friends | orderBy: 'pet.name'"></select>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.