2014-11-23 14 views
11

Tôi cần hiển thị giá trị Boolean thành có/không sử dụng chỉ thị. Chỉ thị của tôi được đưa ra dưới đâyChuyển đổi giá trị boolean thành có/không bằng chỉ thị góc

directives.directive('niBooltoYesno', 
     function() { 
      return { 
       restrict: 'EA', 
       require: 'ngModel', 
       link: function (scope, element, attrs, ngModel) { 
        function formatter(value) { 
         if (value) { 
          return value === true ? 'Yes' : 'No'; 
         } else { 
          return ''; 
         } 
        } 
        ngModel.$formatters.push(formatter); 

       } 
      }; 
     }); 

<ni-boolto-yesno data-ng-model="set_unit.isActive" ></ni-boolto-yesno> 

Nhưng nó không hoạt động. Xin hãy giúp tôi trong thời điểm này.

+0

Bạn nên mô tả chính xác _how_ nó không hoạt động hoặc cung cấp jsfiddle/codepen. – hon2a

+0

tại sao không phải là một cái gì đó giống như chỉ {{user.booleanValue? 'Yes': 'no'}} –

Trả lời

49

Bạn hiện không sử dụng đúng công cụ cho công việc. Đây phải là một bộ lọc:

{{ someBooleanValue | yesNo }} 

Bộ lọc sẽ được đơn giản như

module.filter('yesNo', function() { 
    return function(input) { 
     return input ? 'yes' : 'no'; 
    } 
}); 

Nếu bạn vẫn chọn để sử dụng một chỉ thị, bạn không cần phải ngModel và trình định dạng, được sử dụng vào mẫu các trường phải đọc và ghi vào một mô hình. Tất cả bạn cần là một mẫu:

module.directive('yesNo', function() { 
    return { 
     template: '<span>{{ yesNo ? "yes" : "no" }}</span>', 
     scope: { 
      yesNo: '=' 
     } 
    }; 
}); 

và bạn woud sử dụng nó như

<span yes-no="someBoolean"></span> 
+0

Bộ lọc hoàn hảo cho trường hợp của tôi. –

2

Sự cố xảy ra ở if (value). Điều này làm cho dòng return value === true ? ... chỉ được xử lý khi giá trị thực sự trung thực (tức là không bao giờ cho false). Bạn chỉ cần để xây dựng các điều kiện đúng:

function formatter (value) { 
    return (value === true) ? 'Yes' : ((value === false) ? 'No' : ''); 
} 

Một phiên bản với khả năng đọc tốt hơn:

function formatter (value) { 
    if (value === true) { 
     return 'Yes'; 
    } else if (value === false) { 
     return 'No'; 
    } else { 
     return ''; 
    } 
} 

Edit: Tôi đã không nhìn HTML của bạn. Như một câu trả lời chỉ ra, sử dụng ng-model cho điều này là một ý tưởng tồi, tạo ra một bộ lọc nên phù hợp với bạn tốt.

+0

việc lồng vào các câu lệnh if của bạn hơi lệch (phiên bản đã định dạng). Bạn không thêm khối khác nếu. Khối khác của toán tử bậc ba sẽ chứa số thứ hai nếu khối khác – Kieran

+0

@Kieran 'nếu A {X} else {if B {Y} else {Z}}' tương đương với 'if A {X} nếu B {Y } else {Z} 'và mã phẳng luôn dễ đọc hơn. – hon2a

5

tôi xác định giá trị văn bản cho 0 và 1 với ...

{{object.PROPERTY?'Yes':'No'}} 

... khi được trình bày như sau:

{ 
    "PROPERTY": 0 
} 

Kết quả sau đó sẽ là 'Không'.

+1

Đây thực sự là câu trả lời tốt hơn. Nó đơn giản và sạch sẽ. Câu trả lời của JB Nizet hoạt động hoàn toàn tốt nhưng là quá mức cần thiết trong kịch bản này. Nó phù hợp với những dịp phức tạp hơn. – Rob

Các vấn đề liên quan