2012-01-10 21 views

Trả lời

14

Có một số cách để thực hiện việc này. Tôi đã trình bày 2 cách trong các câu đố được hiển thị ở đây: http://jsfiddle.net/njj2P/2/

Tùy chọn đầu tiên tôi đã hiển thị là sử dụng ko.computed để xác định xem tên có được trả lại ở dạng số ít hay số nhiều hay không, dựa trên đánh giá.

this.formattedName = ko.computed(function() { 
     return this.qty() > 1 ? this.name() + "s" : this.name(); 
    }, this); 

Tùy chọn thứ hai cho biết cách thực hiện điều này mà không có thuộc tính được tính toán và thay vào đó bằng cách sử dụng ràng buộc có điều kiện.

<span data-bind="if:qty()>1">s</span> 
+0

Tôi thực sự đang tìm kiếm một cách rõ ràng để làm "y" thành "ies" hoặc "x" thành "ces", v.v ... Phần này là phần dễ dàng. Tôi đã upvoted anyway, nhưng nó không hoàn toàn là những gì tôi muốn. Bất kỳ ý tưởng? Có gì ngoài kia không? – vbullinger

+0

Tôi upvoted câu trả lời này như tôi đã sử dụng tùy chọn thứ hai trong đó, với thay đổi nhỏ! = Thay vì> để giá trị bằng 0 cho thấy s (tức là O mục phụ, 1 tiểu mục, 2 mục phụ) – MikeScott8

+0

Tôi đồng ý và thực hiện cùng một quan sát và thay đổi mã của tôi. – GenuineRex

12

Bạn có thể tạo liên kết tùy chỉnh có thể tái sử dụng như sau.

ko.bindingHandlers.pluralize = { 
    update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
    function count(data) { 
     var value = ko.utils.unwrapObservable(data); 
     if (typeof value === "object" && value.length > 0) { 
      return value.length; 
     } else if (typeof value === "number") { 
      return value; 
     } 
    } 

    var settings = valueAccessor(); 
    var text = count(settings.data) === 1 ? settings.singular : settings.plural; 
    $(element).text(ko.utils.unwrapObservable(text)); 
    } 
}; 

Bạn sẽ sử dụng nó như thế này.

<span data-bind="pluralize: { data:items, singular:'entry', plural:'entries' }"></span> 
  • Tùy chọn data có thể trỏ đến bất kỳ mảng hoặc số.
  • Tùy chọn singular đại diện cho văn bản mà bạn muốn hiển thị nếu data đánh giá đến 1
  • Tùy chọn plural đại diện cho văn bản sẽ được hiển thị bằng cách khác.

Xem hành động ở đây. http://fiddle.jshell.net/jessegavin/wamfw/

+1

Tôi thực sự thích giải pháp này. – jaffa

+2

Câu trả lời hay! Tôi khuyên bạn nên thêm vào tùy chọn 'none' và tham chiếu ngược lại đến 'count' để nhà phát triển có thể nhận các tùy chọn như '' none '=>" No items ",' singular '=>" 1 item ",' số nhiều '=> "## mục" ' –

+0

Ý tưởng hay. Đó là những gì Angular làm. – jessegavin

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