2013-04-23 21 views
5

Çok sayıda değişkeni olan bir çalışma viewmodel var. Metin kutusunda metin biçimlendirmesi için autoNumeric (http://www.decorplanit.com/plugin/) kullanıyorumKnockout.js ko.observable önce değeri değiştir() yaz

Giriş alanının gözlemlenen verilerini hesaplanabilir bir gözlemlenebilir halde kullanmak isterdim, ancak biçimlendirmeyle birlikte gözlemlenebilir metin alanı değiştirilirse, biçimlendirme de değişkene kaydedilir.

Biçimlendirme olmadan yalnızca giriş alanının değerini nasıl görebilirim?

Bunun en iyi yolu, gözlemlenebilir bir alıcı/ayarlayıcı olabilir ve değer ayarlandığında biçimlendirmeyi kaldırabilir. Ko.observable() için get/set yöntemleri yazmak için nakavt belgelerinde bir çözüm bulamadım ve ko.computed() bir değer kaydedemiyor.

Gizli alanları veya fazla değişkenleri kullanmak istemiyorum.
Bu mümkün mü?

cevap

3

Çözüm,

function AppViewModel(one, two) { 
    this.myNumberOne = ko.observable(one).extend({ numeric: 0 }); 
    this.myNumberTwo = ko.observable(two).extend({ numeric: 2 }); 
} 
+0

Bu ayrıca bir değişken ('result = ko.computed (...)') – mhu

+0

yaratır, ancak görüntüleme modelinde olmaz. – zeal

1

Bunun için ko.computed() kullanabilirsiniz. Sen, bir yazma seçeneği belirtmek Writeable computed observables

Örnek görebilirsiniz (nakavt belgelerine alınan):

function MyViewModel() { 
    this.price = ko.observable(25.99); 

    this.formattedPrice = ko.computed({ 
     read: function() { 
      return '$' + this.price().toFixed(2); 
     }, 
     write: function (value) { 
      // Strip out unwanted characters, parse as float, then write the raw data back to the underlying "price" observable 
      value = parseFloat(value.replace(/[^\.\d]/g, "")); 
      this.price(isNaN(value) ? 0 : value); // Write to underlying storage 
     }, 
     owner: this 
    }); 
} 

ko.applyBindings(new MyViewModel()); 
+0

daha sonra http://knockoutjs.com/documentation/extenders.html

ko.extenders.numeric = function(target, precision) { //create a writeable computed observable to intercept writes to our observable var result = ko.computed({ read: target, //always return the original observables value write: function(newValue) { var current = target(), roundingMultiplier = Math.pow(10, precision), newValueAsNum = isNaN(newValue) ? 0 : parseFloat(+newValue), valueToWrite = Math.round(newValueAsNum * roundingMultiplier)/roundingMultiplier; //only write if it changed if (valueToWrite !== current) { target(valueToWrite); } else { //if the rounded value is the same, but a different value was written, force a notification for the current field if (newValue !== current) { target.notifySubscribers(valueToWrite); } } } }); //initialize with current value to make sure it is rounded appropriately result(target()); //return the new computed observable return result; }; 

görüldüğü Ve dediğim gibi "ko.computed() bir değer kaydedemez" – zeal

+0

av istiyorum daha fazla değişken yaratan oid. cevap değil. – zeal

+0

Ancak yazma seçeneğini kullanırsanız ** bir değeri kaydedebilirsiniz. Belgeleri incelediniz mi? – mhu

İlgili konular