Crea Knockout applyBindings per trattare le opzioni di selezione come numero

Sto usando Knockout in combinazione con html select / option (vedi Fiddle ):

 10 100  

Quando si chiama applyBindings queste opzioni sono trattate come stringhe. Ciò porta a effetti indesiderati. Considera il seguente campione:

 function AreaViewModel() { var self = this; self.Width = ko.observable(10); self.Height = ko.observable(10); self.Area = ko.computed(function () { return self.Width() * self.Height(); }); } $(document).ready(function () { var viewModel = new AreaViewModel(); ko.applyBindings(viewModel); }); 

Quando viene chiamato self.Width , self.Width e self.Height sono self.Height dal loro valore iniziale 10 a “10”, il che porta alla rivalutazione della funzione calcasting.

Questo non sembra essere un grosso problema qui, ma in una soluzione più complessa ho una proprietà PageSize (100/500/1000 Row per Page) che risulta in più chiamate AJAX quando questa proprietà viene modificata.

Quali (fantasiose) soluzioni ci sono per superare questo problema?

Puoi creare Width come computato e scrivere le proprie opzioni “write” e “read” in questo modo:

 var _width = ko.observable(10); self.Width = ko.computed({ read : function(){ return _width; }, write: function(value){ if(typeof value === "string"){ _width(parseInt(value)); } } 

Puoi provare qualcosa del genere

 self.Width = ko.observable(10); self.Width.subscribe(function(newValue){ if(typeof newValue === "string"){ self.Width(parseInt(newValue)); } });