2013-04-15 32 views
12

Tôi đang sử dụng loại trực tiếp để cư giá trị số bên trong một bảng:Thêm định dạng thập phân để loại trực tiếp số ràng buộc dữ liệu

HTML:

<tbody data-bind="foreach: commision"> 
      <tr> 
       <td> 
        <span>R </span><span data-bind="text: Amount"></span> 
       </td> 
      </tr>... 
</tbody> 

Knockout.js phần liên quan đến số tiền và hoa hồng

var vm = { 
      commision: ko.observable(), 
      futurecommision: ko.observable(), 
      commisionpaid: ko.observable(), 
      totals: ko.observable(), 
      commisionPaid: ko.observable(ko.utils.unwrapObservable(ko.mapping.fromJS({ 
       Date: null, 
       Amount: 0 
      }))), 
... 

Bây giờ làm thế nào để tôi hiển thị số đang được dân cư trong fomat thập phân, nói .00? ví dụ: 10.00

Hiện tại, nó chỉ hiển thị số, ví dụ: 10

Trả lời

26

Bạn có thể xem xét việc viết bộ mở rộng tùy chỉnh để xử lý việc này.

Một mở rộng cơ bản là một cái gì đó như:

ko.extenders.numeric = function(target, precision) { 
    var result = ko.computed({ 
     read: function() { 
      return target().toFixed(precision); 
     }, 
     write: target 
    }); 

    result.raw = target; 
    return result; 
}; 

này sau đó sẽ được sử dụng trên quan sát của bạn như:

var commissionPaid = ko.observable(whatever your value is).extend({numeric: 2}); 
+2

+1 hoạt động như một say mê http://jsfiddle.net/m6ZKZ/ lưu ý tuy nhiên dependObservable không được chấp nhận, sử dụng ko.computed() thay vì – xec

+0

@xec điểm tốt, hoàn toàn quên mất rằng – Thewads

+0

cảm ơn bạn Thewads và Cảm ơn bạn xec, đánh giá cao fiddle. Bất kỳ cách nào tôi có thể thêm nhóm chữ số: tức là 10 000.00, 100 000.00, 1 000 000.00 vv? – DextrousDave

6

Có xem xét này KO tiền Extender:

http://jsfiddle.net/digitalbush/R6MPU/

(function(){ 
    var format = function(value) { 
     toks = value.toFixed(2).replace('-', '').split('.'); 
     var display = '$' + $.map(toks[0].split('').reverse(), function(elm, i) { 
      return [(i % 3 === 0 && i > 0 ? ',' : ''), elm]; 
     }).reverse().join('') + '.' + toks[1]; 

     return value < 0 ? '-' + display : display; 
    }; 

ko.subscribable.fn.money = function() { 
    var target = this; 

    var writeTarget = function(value) { 
     var stripped=value 
      .replace(/[^0-9.-]/g, ''); 

     target(parseFloat(stripped)); 
    }; 

    var result = ko.computed({ 
     read: function() { 
      return target(); 
     }, 
     write: writeTarget 
    }); 

    result.formatted = ko.computed({ 
     read: function() { 
      return format(target()); 
     }, 
     write: writeTarget 
    }); 

    result.isNegative = ko.computed(function(){ 
     return target()<0; 
    }); 

    return result; 
}; 
})(); 

//Wire it up 
$(function() { 
    var viewModel = { 
     Cash: ko.observable(-1234.56).money(), 
     Check: ko.observable(2000).money(), 
     showJSON: function() { 
      alert(ko.toJSON(viewModel)); 
     } 
    }; 


    viewModel.Total = ko.computed(function() { 
     return this.Cash() + this.Check(); 
    }, viewModel).money(); 
    ko.applyBindings(viewModel); 
}); 
+0

, cảm ơn bạn – DextrousDave

+0

hữu ích cảm ơn bạn –

+0

@David Công việc tuyệt vời. Tôi đang tìm sửa lỗi này cho các biến giá trị tiền có thể ghi. Tôi đã thực hiện hai thay đổi trên những gì bạn đã làm: 1. Khi giá trị thay đổi trong trường nhập, nó ngay lập tức cố gắng định dạng giá trị tức là trước khi người dùng nhập xong, định dạng giá trị và cập nhật trong trường nhập không mong muốn. Do đó, tôi đã sử dụng Ratelimit để thúc đẩy thay đổi sau khi trì hoãn self.Variable = ko.observable(). Extend ({rateLimit: 2000}). Money() 2. Ngoài ra, trong trường nhập nếu giá trị bị xóa, nó đang hiển thị Thông báo lỗi NaN. Để xử lý tôi đặt kiểm tra IsNaN ở định dạng chức năng – user2185592

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