AngularJS ng-class นิพจน์ if-else


257

ด้วยAngularJSฉันใช้ng-classวิธีต่อไปนี้:

<div class="bigIcon" data-ng-click="PickUp()" 
ng-class="{first:'classA', second:'classB', third:'classC', fourth:'classC'}[call.State]"/>

ฉันสงสัยว่าฉันสามารถใช้การif-elseแสดงออกเพื่อทำสิ่งที่คล้ายกับนี้:

<div class="bigIcon" data-ng-click="PickUp()" 
ng-class="{first:'classA', second:'classB', else:'classC'}[call.State]"/>

ดังนั้นเมื่อใดที่call.Stateแตกต่างจากfirstหรือsecondใช้classCและหลีกเลี่ยงการระบุแต่ละค่า

คำตอบ:


523

ใช้คำสั่ง if-then แบบอินไลน์ซ้อนกัน ( ผู้ประกอบการ Ternary )

<div ng-class=" ... ? 'class-1' : ( ... ? 'class-2' : 'class-3')">

ตัวอย่างเช่น :

<div ng-class="apt.name.length >= 15 ? 'col-md-12' : (apt.name.length >= 10 ? 'col-md-6' : 'col-md-4')">
    ...
</div>

และให้แน่ใจว่าเพื่อนร่วมงานของคุณสามารถอ่านได้ :)


2
ถ้าฉันต้องการเพิ่มสองคลาส
mircobabini

2
ขออภัยฉันหมายถึง "classe if this และ class อื่นถ้านั่น" สองชั้นสองเงื่อนไขที่แตกต่าง
mircobabini

17
@mircobabini, ng-class="{'class1': ##condition1## , 'class2': ##condition2## }"ที่คุณสามารถดูในคำถามข้างต้น
Jossef Harush

2
นี่ไม่ใช่สิ่งที่ฉันต้องการเห็นในมุมมอง วิธีตรรกะมากเกินไปสำหรับมุมมอง
AturSams

19
@ Zehelvion ฉันต้องไม่เห็นด้วย นี่คือตรรกะมุมมอง คุณไม่ต้องการที่จะกำหนดระดับคอลัมน์ที่จะใช้ในตัวควบคุมของคุณหรือบริการ .. นี่คือที่ที่มันควรจะเป็น
Nick

108

คุณสามารถลองโดยใช้ฟังก์ชั่นเช่นนี้:

<div ng-class='whatClassIsIt(call.State)'>

จากนั้นให้วางตรรกะของคุณไว้ในฟังก์ชัน:

    $scope.whatClassIsIt= function(someValue){
     if(someValue=="first")
            return "ClassA"
     else if(someValue=="second")
         return "ClassB";
     else
         return "ClassC";
    }

ฉันทำซอกับตัวอย่าง: http://jsfiddle.net/DotDotDot/nMk6M/


6
นี่เป็นวิธีที่ดีกว่าตัวดำเนินการแบบไตรภาค
David พูดว่า Reinstate Monica

2
รักมัน สิ่งนี้ทำให้ html สะอาดยิ่งขึ้นกว่าเงื่อนไข ng-class แบบง่าย
mrgnw

17
ปัญหาเกี่ยวกับวิธีการนี้คือตอนนี้คุณกำลังทำให้คอนโทรลเลอร์ทราบถึงคลาส CSS ไม่ใช่วิธีการที่ดี การมีตัวแปรที่ตั้งค่าไว้ในคอนโทรลเลอร์แล้วพิจารณาว่าคลาสใดที่จะใช้ใน HTML จากตัวแปรนั้นเป็นทางออกที่ดีกว่า
VtoCorleone

1
นี่เป็นเพียงคำแนะนำเกี่ยวกับวิธีที่คุณสามารถทำได้ปัญหานี้ง่ายพอที่จะจัดการกับผู้ประกอบการที่สาม แต่เมื่อคุณต้องการตรรกะมากขึ้นคุณไม่ต้องการที่จะทำใน HTML โดยตรงหนึ่งในวิธีที่เร็วที่สุดคือ เช่นเดียวกับที่ฉันทำเพื่อใช้ฟังก์ชันในคอนโทรลเลอร์ของคุณ (ถ้าคุณไม่ต้องการให้คอนโทรลเลอร์ทราบถึง CSS คุณสามารถดูและตั้งค่าตัวแปรขอบเขตและใช้เงื่อนไขใน HTML ตามค่านั้นได้ ) แต่ถ้าคุณมีเหตุผลมากกว่านี้เล็กน้อยหรือการทำซ้ำ ๆ หลายอย่างให้ใส่คำสั่งลงไปมันควรจะสะอาดกว่า ตัวอย่างส่วนใหญ่เกี่ยวกับการไม่ใส่ตรรกะใน HTML
DotDotDot

1
ดีกว่าผู้ประกอบการที่ประกอบไปด้วยถ้าคุณต้องการที่จะเพิ่มเงื่อนไขสำหรับมากกว่า 2 หรือ 3 ชั้นที่แตกต่างกันแยก html ด้วยตรรกะ :)
23490 Tho Vo

61

ฉันมีสถานการณ์ที่ฉันต้องการสองประโยค 'ถ้า' ที่อาจเป็นจริงและเป็น 'อื่น' หรือเป็นค่าเริ่มต้นหากไม่เป็นจริงไม่แน่ใจว่านี่เป็นการปรับปรุงคำตอบของ Jossef แต่ดูเหมือนว่าฉันจะสะอาดขึ้น:

ng-class="{'class-one' : value.one , 'class-two' : value.two}" class="else-class"

โดยที่ value.one และ value.two เป็นจริงพวกมันจะอยู่เหนือคลาส. else


13

ชัดเจน ! เราสามารถสร้างฟังก์ชั่นเพื่อส่งคืนชื่อคลาส CSS ด้วยตัวอย่างต่อไปนี้ ป้อนคำอธิบายรูปภาพที่นี่

CSS

<style>
    .Red {
        color: Red;
    }
    .Yellow {
        color: Yellow;
    }
      .Blue {
        color: Blue;
    }
      .Green {
        color: Green;
    }
    .Gray {
        color: Gray;
    }
     .b{
         font-weight: bold;
    }
</style>

JS

<script>
    angular.module('myapp', [])
            .controller('ExampleController', ['$scope', function ($scope) {
                $scope.MyColors = ['It is Red', 'It is Yellow', 'It is Blue', 'It is Green', 'It is Gray'];
                $scope.getClass = function (strValue) {
                    if (strValue == ("It is Red"))
                        return "Red";
                    else if (strValue == ("It is Yellow"))
                        return "Yellow";
                    else if (strValue == ("It is Blue"))
                        return "Blue";
                    else if (strValue == ("It is Green"))
                        return "Green";
                    else if (strValue == ("It is Gray"))
                        return "Gray";
                }
        }]);
</script>

และจากนั้น

<body ng-app="myapp" ng-controller="ExampleController">

<h2>AngularJS ng-class if example</h2>
<ul >
    <li ng-repeat="icolor in MyColors" >
        <p ng-class="[getClass(icolor), 'b']">{{icolor}}</p>
    </li>
</ul>
<hr/>
<p>Other way using : ng-class="{'class1' : expression1, 'class2' : expression2,'class3':expression2,...}"</p>
<ul>
    <li ng-repeat="icolor in MyColors">
        <p ng-class="{'Red':icolor=='It is Red','Yellow':icolor=='It is Yellow','Blue':icolor=='It is Blue','Green':icolor=='It is Green','Gray':icolor=='It is Gray'}" class="b">{{icolor}}</p>
    </li>
</ul>

คุณสามารถอ้างถึงหน้ารหัสเต็มได้ที่ตัวอย่างเช่น


3

วิธีการแก้ปัญหาข้างต้นไม่ได้ผลสำหรับชั้นเรียนด้วยภาพพื้นหลังอย่างใด สิ่งที่ฉันทำคือฉันสร้างคลาสเริ่มต้น (สิ่งที่คุณต้องการในอื่น) และตั้งค่า class = 'defaultClass' จากนั้น ng-class = "{class1: abc, class2: xyz}"

<span class="booking_warning" ng-class="{ process_success: booking.bookingStatus == 'BOOKING_COMPLETED' || booking.bookingStatus == 'BOOKING_PROCESSED', booking_info: booking.bookingStatus == 'INSTANT_BOOKING_REQUEST_RECEIVED' || booking.bookingStatus == 'BOOKING_PENDING'}"> <strong>{{booking.bookingStatus}}</strong> </span>

PS: คลาสที่อยู่ในสภาพควรแทนที่คลาสเริ่มต้นเช่นทำเครื่องหมายเป็น! สำคัญ


1

นี่เป็นวิธีที่ดีที่สุดและเชื่อถือได้ในการทำเช่นนี้ นี่คือตัวอย่างง่ายๆและหลังจากนั้นคุณสามารถพัฒนาตรรกะที่กำหนดเองของคุณ:

//In .ts
public showUploadButton:boolean = false;

if(some logic)
{
    //your logic
    showUploadButton = true;
}

//In template
<button [class]="showUploadButton ? 'btn btn-default': 'btn btn-info'">Upload</button>

0

วิธีแก้ปัญหาของฉันคือการปรับเปลี่ยนตัวแปรแบบสำหรับการสลับระดับ ng-class:

ตัวอย่างเช่นฉันต้องการสลับคลาสตามสถานะของรายการของฉัน:

1) เมื่อใดก็ตามที่รายการของฉันว่างเปล่าฉันอัปเดตโมเดลของฉัน:

$scope.extract = function(removeItemId) {
    $scope.list= jQuery.grep($scope.list, function(item){return item.id != removeItemId});
    if (!$scope.list.length) {
        $scope.liststate = "empty";
    }
}

2) เมื่อใดก็ตามที่รายการของฉันไม่ว่างเปล่าฉันจะตั้งค่าสถานะอื่น

$scope.extract = function(item) {
    $scope.list.push(item);
    $scope.liststate = "notempty";
}

3) เมื่อรายชื่อของฉันไม่เคยถูกแตะต้องฉันต้องการให้คลาสอื่น (นี่คือตำแหน่งที่หน้าเริ่มต้น):

$scope.liststate = "init";

3) ฉันใช้โมเดลเพิ่มเติมนี้ใน ng-class ของฉัน:

ng-class="{'bg-empty': liststate == 'empty', 'bg-notempty': liststate == 'notempty', 'bg-init': liststate = 'init'}"


-3

คุณสามารถลองวิธีนี้:

</p><br /><br />
<p>ng-class="{test: obj.value1 == 'someothervalue' || obj.value2 == 'somethingelse'}<br /><br /><br />

ng-class="{test: obj.value1 == 'someothervalue' || obj.value2 == 'somethingelse'}

คุณจะได้รับรายละเอียดที่สมบูรณ์จากที่นี่

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