Toán tử ternary trong các mẫu AngularJS


239

Làm thế nào để bạn làm một ternary với AngularJS (trong các mẫu)?

Sẽ tốt hơn nếu sử dụng một số thuộc tính html (lớp và kiểu) thay vì tạo và gọi một hàm của bộ điều khiển.

Câu trả lời:


374

Cập nhật : Angular 1.1.5 đã thêm một toán tử ternary , vì vậy bây giờ chúng ta chỉ cần viết

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

Nếu bạn đang sử dụng phiên bản Angular trước đó, hai lựa chọn của bạn là:

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

mục 2. ở trên tạo ra một đối tượng có hai thuộc tính. Cú pháp mảng được sử dụng để chọn thuộc tính có tên true hoặc thuộc tính có tên false và trả về giá trị liên quan.

Ví dụ,

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

$ đầu tiên được đặt thành true bên trong một lặp lại ng cho phần tử đầu tiên, do đó, ở trên sẽ áp dụng lớp 'myClass1' và 'myClass2' chỉ lần đầu tiên qua vòng lặp.

Với ng-class có một cách dễ dàng hơn: ng-class có một biểu thức phải đánh giá theo một trong các cách sau:

  1. một chuỗi các tên lớp được phân tách bằng dấu cách
  2. một mảng các tên lớp
  3. một ánh xạ / đối tượng của các tên lớp thành các giá trị boolean.

Một ví dụ về 1) đã được đưa ra ở trên. Đây là một ví dụ về 3, mà tôi nghĩ đọc tốt hơn nhiều:

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

Lần đầu tiên thông qua một vòng lặp lặp lại, lớp myClass được thêm vào. Lần thứ 3 đến (chỉ số $ bắt đầu từ 0), lớp AnotherClass được thêm vào.

ng-style lấy một biểu thức phải đánh giá thành bản đồ / đối tượng của các tên kiểu CSS thành các giá trị CSS. Ví dụ,

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

6
Nếu tôi có thể tôi sẽ nâng cấp bạn một lần nữa để cập nhật câu hỏi!
Narretz

2
Tôi sẽ chăm sóc nó, @Narretz.
Ian Hunter

1
Trong ví dụ truy cập khóa đối tượng, bạn có thể bỏ qua khóa 'false' vì dù sao đó là chuỗi rỗng.
0xc0de

Lời cảnh báo, 1.1.5 hiện không ổn định.
Adam Grant

Điều gì nếu thay đổi điều kiện khi mô hình của bạn được cập nhật? Tôi muốn ng-stylecập nhật, nhưng dường như chỉ được đánh giá khi phần tử được hiển thị lần đầu tiên. (Noob góc cạnh ở đây)
Hartley Brody

86

Cập nhật: Angular 1.1.5 đã thêm một toán tử ternary, câu trả lời này chỉ đúng với các phiên bản trước 1.1.5. Cho 1.1.5 trở lên, xem câu trả lời hiện được chấp nhận.

Trước góc 1.1.5:

Hình thức của một con chim nhạn trong angularjs là:

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

Một ví dụ sẽ là:

<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>

hoặc là:

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

1
Kỳ dị. Điều đó không trực quan lắm. Tôi tự hỏi tại sao nó được thực hiện theo cách này.
Ben Lesh

4
Ternary không bao giờ bị bắt chước, nhưng đây chỉ là sử dụng các toán tử nhị phân theo cách chúng hoạt động.
Andrew Joslin

18
@bledh, AngularJS thúc đẩy khả năng kiểm tra. Mẫu không nên chứa bất kỳ logic. Một toán tử ternary trong một mẫu nên được cấu trúc lại thành một lệnh gọi hàm đến bộ điều khiển, để kiểm tra tốt hơn.
Marcello Nuccio

1
@ arg20 bạn nên sử dụng chỉ thị ngClass (hoặc ngClassEven và ngClassOdd). Sau đó đặt tất cả logic để chọn các lớp css trong bộ điều khiển. Điều này dễ dàng hơn nhiều để kiểm tra tự động.
Marcello Nuccio

1
@ arg20 Tôi nói để đặt nó trong bộ điều khiển, không phải trong mô hình. Đây không phải là một vấn đề. Tuy nhiên, tài liệu nói: "Kết quả của việc đánh giá có thể là một chuỗi biểu thị các tên lớp được phân tách bằng dấu cách, một mảng hoặc một bản đồ của các tên lớp thành các giá trị boolean". Có nghĩa là bạn có thể sử dụng "{cssclass: someBoolCheck ()}" làm biểu thức, tức là bạn đặt lớp css trong dạng xem và logic trong trình điều khiển. Nhìn vào jsFiddle này cho một ví dụ.
Marcello Nuccio

23

Đối với văn bản trong mẫu góc ( userTypelà thuộc tính của $ scope, như $ scope.userType):

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

11

Đến bây giờ, tất cả chúng ta đã tìm ra phiên bản 1.1.5 đi kèm với một ternary thích hợp trong $parsechức năng, vì vậy chỉ cần sử dụng câu trả lời này như một ví dụ về các bộ lọc:

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

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

Và sau đó sử dụng nó như là

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

2
Tôi đã đến câu hỏi này cho nhà điều hành ternary nhưng cuối cùng tôi đã đi với một bộ lọc và nó cảm thấy thực sự tốt ... = D
slacktracer


10

Mặc dù bạn có thể sử dụng condition && if-true-part || if-false-part-syntax trong các phiên bản cũ hơn của góc, toán tử ternary thông thường condition ? true-part : false-partcó sẵn trong Angular 1.1.5 trở lên .


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>

Nút chuyển đổi và thay đổi tiêu đề của nút và hiển thị / ẩn bảng div. Xem Plunkr

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.