ผู้ประกอบการที่สามในแม่แบบ AngularJS


239

คุณจะทำไตรภาคกับ AngularJS (ในแม่แบบ) ได้อย่างไร?

มันจะเป็นการดีที่จะใช้บางอย่างในคุณลักษณะ html (คลาสและสไตล์) แทนที่จะสร้างและเรียกใช้ฟังก์ชันของคอนโทรลเลอร์

คำตอบ:


374

ปรับปรุง : Angular 1.1.5 เพิ่มผู้ประกอบการที่ประกอบไปด้วยดังนั้นตอนนี้เราสามารถเขียน

<li ng-class="$first ? 'firstRow' : 'nonFirstRow'">

หากคุณใช้ Angular รุ่นก่อนหน้าตัวเลือกสองทางของคุณคือ:

  1. (condition && result_if_true || !condition && result_if_false)
  2. {true: 'result_if_true', false: 'result_if_false'}[condition]

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

เช่น,

<li class="{{{true: 'myClass1 myClass2', false: ''}[$first]}}">...</li>
 or
<li ng-class="{true: 'myClass1 myClass2', false: ''}[$first]">...</li>

$ first ถูกตั้งค่าเป็นจริงภายใน ng-repeat สำหรับองค์ประกอบแรกดังนั้นข้างต้นจะใช้คลาส 'myClass1' และ 'myClass2' เพียงครั้งแรกผ่านลูป

ด้วยng-classมีวิธีที่ง่ายกว่าแม้ว่า: ng-class รับนิพจน์ที่ต้องประเมินเป็นอย่างใดอย่างหนึ่งต่อไปนี้:

  1. สตริงของชื่อคลาสที่คั่นด้วยช่องว่าง
  2. อาร์เรย์ของชื่อคลาส
  3. แผนที่ / วัตถุของชื่อชั้นเรียนเพื่อค่าบูลีน

ตัวอย่างของ 1) ได้รับด้านบน นี่คือตัวอย่างของ 3 ซึ่งฉันคิดว่าอ่านดีกว่ามาก:

 <li ng-class="{myClass: $first, anotherClass: $index == 2}">...</li>

ครั้งแรกที่ผ่านการวนซ้ำ ng จะเพิ่มคลาส myClass ครั้งที่ 3 ถึง ($ index เริ่มต้นที่ 0), class anotherClass ถูกเพิ่มเข้ามา

ng-styleรับนิพจน์ที่ต้องประเมินเป็นแผนที่ / วัตถุของชื่อสไตล์ CSS เป็นค่า CSS เช่น,

 <li ng-style="{true: {color: 'red'}, false: {}}[$first]">...</li>

6
ถ้าฉันสามารถฉันจะโหวตคุณอีกครั้งสำหรับการปรับปรุงคำถาม!
Narretz

2
ฉันจะดูแลมัน @Narretz
เอียนฮันเตอร์

1
ในตัวอย่างการเข้าถึงคีย์วัตถุคุณสามารถข้ามคีย์ 'false' เนื่องจากเป็นสตริงว่างเปล่า
0xc0de

คำเตือน 1.1.5 ไม่มั่นคงในขณะนี้
Adam Grant

จะเป็นอย่างไรถ้าเงื่อนไขมีการเปลี่ยนแปลงเมื่อมีการอัปเดตโมเดลของคุณ ฉันต้องการng-styleอัปเดต แต่ดูเหมือนว่าจะประเมินเฉพาะเมื่อมีการแสดงองค์ประกอบเป็นครั้งแรก (noob เชิงมุมที่นี่)
Hartley Brody

86

ปรับปรุง: Angular 1.1.5 เพิ่มผู้ประกอบการที่ประกอบไปด้วยสามคำตอบนี้ถูกต้องเฉพาะกับรุ่นก่อนหน้า 1.1.5 สำหรับ 1.1.5 และใหม่กว่าให้ดูคำตอบที่ยอมรับในปัจจุบัน

ก่อนเชิงมุม 1.1.5:

รูปแบบของไตรภาคใน angularjs คือ:

((condition) && (answer if true) || (answer if false))

ตัวอย่างจะเป็น:

<ul class="nav">
    <li>
        <a   href="#/page1" style="{{$location.path()=='/page2' && 'color:#fff;' || 'color:#000;'}}">Goals</a>
    </li>
    <li>
        <a   href="#/page2" style="{{$location.path()=='/page2' && 'color:#fff;' || 'color:#000;'}}">Groups</a>
    </li>
</ul>

หรือ:

 <li  ng-disabled="currentPage == 0" ng-click="currentPage=0"  class="{{(currentPage == 0) && 'disabled' || ''}}"><a> << </a></li>

1
แปลก. นั่นไม่ง่ายนัก ฉันสงสัยว่าทำไมมันจึงถูกใช้งานในลักษณะนี้
เบ็นเลช

4
Ternary ไม่เคยดำเนินการใด ๆ แต่นี่เป็นเพียงการใช้ตัวดำเนินการไบนารีตามที่พวกเขาทำงาน
Andrew Joslin

18
@blesh, AngularJS ส่งเสริมการทดสอบ เทมเพลตไม่ควรมีตรรกะใด ๆ ผู้ประกอบการที่ประกอบไปด้วยเทมเพลตควรได้รับการ refactored เพื่อเรียกใช้ฟังก์ชันไปยังตัวควบคุมเพื่อให้สามารถทดสอบได้ดีขึ้น
Marcello Nuccio

1
@ arg20 คุณควรใช้คำสั่งngClass (หรือ ngClassEven และ ngClassOdd) จากนั้นให้ตรรกะทั้งหมดสำหรับการเลือกคลาส css ในคอนโทรลเลอร์ วิธีนี้ง่ายกว่าที่จะทดสอบโดยอัตโนมัติ
Marcello Nuccio

1
@ arg20 ฉันพูดเพื่อวางไว้ในตัวควบคุมไม่ใช่ในรูปแบบ สิ่งนี้ไม่ควรเป็นปัญหา อย่างไรก็ตามเอกสารอธิบายว่า: "ผลลัพธ์ของการประเมินผลอาจเป็นสตริงที่แสดงชื่อคลาสที่คั่นด้วยช่องว่างอาร์เรย์หรือแผนที่ของชื่อคลาสไปเป็นค่าบูลีน" ความหมายที่คุณสามารถใช้ "{cssclass: someBoolCheck ()}" เป็นนิพจน์กล่าวคือคุณใส่คลาส css ในมุมมองและตรรกะในตัวควบคุม ดูตัวอย่างjsFiddle นี้
Marcello Nuccio

23

สำหรับข้อความในเทมเพลตเชิงมุม ( userTypeเป็นคุณสมบัติของ $ scope เช่น $ scope.userType):

<span>
  {{userType=='admin' ? 'Edit' : 'Show'}}
</span>

11

ในตอนนี้เราพบว่าเวอร์ชั่น1.1.5มาพร้อมกับส่วนที่สามของ$parseฟังก์ชันดังนั้นให้ใช้คำตอบนี้เป็นตัวอย่างของตัวกรอง:

angular.module('myApp.filters', [])

  .filter('conditional', function() {
    return function(condition, ifTrue, ifFalse) {
      return condition ? ifTrue : ifFalse;
    };
  });

และจากนั้นใช้มันเป็น

<i ng-class="checked | conditional:'icon-check':'icon-check-empty'"></i>

2
ฉันมาถึงคำถามนี้สำหรับผู้ประกอบการที่สาม แต่ท้ายที่สุดฉันไปกับตัวกรองและมันรู้สึกดีจริงๆ ... = D
slacktracer



0
  <body ng-app="app">
  <button type="button" ng-click="showme==true ? !showme :showme;message='Cancel Quiz'"  class="btn btn-default">{{showme==true ? 'Cancel Quiz': 'Take a Quiz'}}</button>
    <div ng-show="showme" class="panel panel-primary col-sm-4" style="margin-left:250px;">
      <div class="panel-heading">Take Quiz</div>
      <div class="form-group col-sm-8 form-inline" style="margin-top: 30px;margin-bottom: 30px;">

        <button type="button" class="btn btn-default">Start Quiz</button>
      </div>
    </div>
  </body>

สลับปุ่มและเปลี่ยนส่วนหัวของปุ่มและแสดง / ซ่อนแผงควบคุม ดูPlunkr

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