2013-04-15 10 views
12

używam nokaut zapełnić wartości liczbowych wewnątrz tabeli:Dodawanie formatowania przecinek Knockout liczba powiązań danych

HTML:

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

Knockout.js części dotyczącej ilości i prowizja

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 
      }))), 
... 

Teraz, jak wyświetlić liczbę, która jest wyświetlana w systemie dziesiętnym, na przykład .00? np. 10,00

Obecnie pokazuje tylko numer, na przykład 10

Odpowiedz

26

Można zajrzeć do pisania niestandardowego przedłużacz z tym poradzić.

Podstawowym extender jest coś takiego:

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

    result.raw = target; 
    return result; 
}; 

ta jest następnie wykorzystywana na swoim obserwabli jak:

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

+1 działa jak urok http://jsfiddle.net/m6ZKZ/ pamiętaj jednak, że dependent dependObservable jest przestarzałe, użyj ko.computed() zamiast – xec

+0

@xec dobre miejsce, całkowicie zapomniałem o tym – Thewads

+0

dziękuję Thewads i Thank you xec, doceń skrzypce. W dowolny sposób mogę dodać grupowanie cyfr: tj. 10 000,00, 100 000,00, 1 000 000,00 itd.? – DextrousDave

6

Wystarczy popatrzeć na tej KO Pieniądze 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

ładne, dziękuję – DextrousDave

+0

przydatne dziękuję –

+0

@David Doskonała robota. Szukałem tej poprawki dla zapisywalnych zmiennych wartości pieniężnych. Dokonałem dwóch zmian w stosunku do tego, co zrobiłeś: 1. Gdy wartość zmienia się w polu wejściowym, natychmiast próbuje sformatować wartość, tj. Przed zakończeniem pisania przez użytkownika, formatuje wartość i aktualizuje w polu wejściowym, które nie jest pożądany. Dlatego użyłem Ratelimit do zgłaszania zmian po opóźnieniu: self.Variable = ko.observable(). Extend ({rateLimit: 2000}). Money() 2. Również w polu wejściowym, jeśli wartość została usunięta, było wyświetlane Komunikat o błędzie NaN. Aby sobie z tym poradzić, sprawdziłem IsNaN w funkcji formatu – user2185592

Powiązane problemy