AngularJS สลับคลาสโดยใช้ ng-class


217

ฉันพยายามที่จะสลับชั้นขององค์ประกอบที่ใช้ ng-class

<button class="btn">
  <i ng-class="{(isAutoScroll()) ? 'icon-autoscroll' : 'icon-autoscroll-disabled'}"></i>
</button>

isAutoScroll ():

$scope.isAutoScroll = function()
{
    $scope.autoScroll = ($scope.autoScroll) ? false : true;
    return $scope.autoScroll;
}

โดยทั่วไปถ้า$scope.autoScrollเป็นจริงฉันต้องการ ng-class เป็นicon-autoscrollและถ้ามันเป็นเท็จฉันต้องการให้เป็นicon-autoscroll-disabled

สิ่งที่ฉันมีตอนนี้ไม่ทำงานและกำลังสร้างข้อผิดพลาดนี้ในคอนโซล

Error: Lexer Error: Unexpected next character at columns 18-18 [?] in expression [{(isAutoScroll()) ? 'icon-autoscroll' : 'icon-autoscroll-disabled'}].

ฉันจะทำอย่างถูกต้องได้อย่างไร

แก้ไข

โซลูชันที่ 1: (ล้าสมัย)

<button class="btn" ng-click="autoScroll = !autoScroll">
  <i ng-class="{'icon-autoscroll': autoScroll, 'icon-autoscroll-disabled': !autoScroll}"></i>
</button>

แก้ไข 2

โซลูชันที่ 2:

ฉันต้องการอัปเดตโซลูชันSolution 3ตามที่ Stewie จัดหาให้ควรใช้ มันเป็นมาตรฐานมากที่สุดเมื่อพูดถึงผู้ประกอบการที่สาม (และสำหรับฉันที่ง่ายที่สุดในการอ่าน) ทางออกจะเป็นอย่างไร

<button class="btn" ng-click="autoScroll = !autoScroll">
  <i ng-class="autoScroll ? 'icon-autoscroll' : 'icon-autoscroll-disabled'"></i>
</button>

แปลเป็น:

if (autoScroll == true) ?// ใช้คลาส'icon-autoscroll' :// ใช้อย่างอื่น'icon-autoscroll-disabled'


ไม่สามารถใช้เงื่อนไขในangular expressionsเอกสารต่อ => ไม่มีคำสั่งควบคุมการไหล:คุณไม่สามารถดำเนินการใด ๆ ต่อไปนี้ในนิพจน์เชิงมุม: เงื่อนไขวงวนหรือโยน ใช้ฟังก์ชั่นหรือคำสั่งอื่น
charlietfl

@ Ronnie ฉันเห็นวิธีการแก้ปัญหาของคุณและมันก็เจ๋งมาก แต่ฉันสงสัยว่าทำไมที่autoScrollนี่จะมีผลในแต่ละปุ่ม? (ฉันทดสอบมันด้วยปุ่มหลายปุ่มและทำงานได้ดีเช่นกัน) ฉันหมายถึงเมื่อฉันคลิกแต่ละปุ่มมันจะมีผลเพียงปุ่มนั้นแทนที่จะเป็นปุ่มทั้งหมด
zx1986

คำตอบ:


436

วิธีใช้เงื่อนไขใน ng-class:

โซลูชันที่ 1:

<i ng-class="{'icon-autoscroll': autoScroll, 'icon-autoscroll-disabled': !autoScroll}"></i>

โซลูชันที่ 2:

<i ng-class="{true: 'icon-autoscroll', false: 'icon-autoscroll-disabled'}[autoScroll]"></i>

โซลูชัน 3 (เชิงมุม v.1.1.4 + แนะนำการสนับสนุนสำหรับผู้ประกอบการที่ประกอบไปด้วย):

<i ng-class="autoScroll ? 'icon-autoscroll' : 'icon-autoscroll-disabled'"></i>

Plunker


3
ตัวอย่างที่สองนั้นสะอาดกว่า แต่มันไร้สาระที่คุณไม่สามารถใส่ตัวแปรที่คุณกำลังประเมินที่ด้านหน้าของนิพจน์ได้ ... มันแค่อ่านตลก ลองนึกภาพดูที่การแสดงออกเป็นคำสั่ง if: "if (variable) จริง: ทำสิ่งนี้ false: ทำอย่างนั้น ... ugh #fullynerdy
mattdlockyer

10
@Stewie Faaakin คู่หูที่งดงามรักมันดูเหมือนโค้ดจริงและไม่ใช่มาร์กอัปนิพจน์ที่ถูก
กลั่นแกล้ง

การประเมินค่าจริง ๆ แล้วมีประโยชน์มากเนื่องจากหลีกเลี่ยงการกำหนดค่าใหม่โดยไม่ตั้งใจ
lharby

Ternary เป็นสิ่งที่ฉันกำลังมองหา งานที่ดีมีสามตัวอย่างพร้อมรายละเอียดการสนับสนุนเวอร์ชัน
TaeKwonJoe

13

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

<i ng-class="autoScroll && 'icon-autoscroll' || !autoScroll && 'icon-autoscroll-disabled'"></i>

มันเป็นเพียงไวยากรณ์ที่สั้นกว่าเล็กน้อย แต่สำหรับฉันอ่านง่ายขึ้น


10

เพิ่มมากกว่าหนึ่งคลาสตามเงื่อนไข:

<div ng-click="AbrirPopUp(s)" 
ng-class="{'class1 class2 class3':!isNew, 
           'class1 class4': isNew}">{{ isNew }}</div>

สมัคร: class1 + + class2 Class3 เมื่อisNew = false ,

ใช้: class1 + class4 เมื่อisNew = true


6
<div data-ng-init="featureClass=false" 
     data-ng-click="featureClass=!featureClass" 
     data-ng-class="{'active': featureClass}">
    Click me to toggle my class!
</div>

คล้ายกับtoggleClassวิธีของ jQuery นี่เป็นวิธีการสลับเปิดactive/ ปิดคลาสเมื่อองค์ประกอบถูกคลิก


2
คุณช่วยให้ข้อมูลเพิ่มเติมเกี่ยวกับคำตอบเป็นภาษาอังกฤษได้ไหม? มันแตกต่างจากคำตอบที่มีอยู่แล้วที่นี่ได้อย่างไร
หัวหอม

2
ฉันไม่แน่ใจว่าทำไมคำตอบนี้มีคะแนนโหวตเป็นลบมากมาย? นี้เป็นวิธีการที่ทำงานจริงดีสำหรับฉันกว่าคนอื่น ๆ ดังกล่าวข้างต้น ...
เปาโล Griiettner

2
ฉันคิดว่าคำอธิบายนั้นเขียนได้ไม่ดีนักและผู้คนก็ตอบสนองต่อคำว่า "jQuery" คำอธิบายนั้นมีความหมายว่าอะไร BTW คุณต้องเริ่มต้นตัวแปรหรือไม่?
ออกแบบโดย Adrian

1

autoscroll จะถูกกำหนดและแก้ไขในคอนโทรลเลอร์

<span ng-class= "autoscroll?'class_if_true':'class_if_false'"></span>

เพิ่มหลายคลาสตามเงื่อนไขโดย:

<span ng-class= "autoscroll?'first second third':'classes_if_false'"></span>


-1

ฉันทำสิ่งนี้ด้วยวิธีนี้:

<button class="btn" ng-click='toggleClass($event)'>button one</button>
<button class="btn" ng-click='toggleClass($event)' >button two</button>

// ในคอนโทรลเลอร์ของคุณ

 $scope.toggleClass = function (event){
        $(event.target).toggleClass('active');
    }

2
ในขณะที่ใช้งานได้คุณกำลังผสมแองกูลาร์และ jQuery คุณควรพยายามหลีกเลี่ยงหากทำได้ สิ่งที่ถามมาสามารถทำได้โดยไม่ต้องคลิกเหตุการณ์ ถ้าคุณมีปุ่มอื่นที่ควรจะสลับคลาสนี้กับปุ่มของคุณด้านบน จะไม่อัปเดตในขณะนี้เนื่องจากคุณกำลังเปลี่ยนเมื่อคลิกและไม่ผ่าน ng-class
Ronnie

1
มาจาก jqLite สำหรับdocs.angularjs.org/api/ng/function/angular.element
Ruhul Amin

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