2013-04-23 4 views
5

Ich habe ein funktionierendes Viewmodel mit zahlreichen Variablen.Knockout.js Wert vor ko.observable() ändern schreiben

Ich benutze AutoNumeric (http://www.decorplanit.com/plugin/) für Textformatierung in Textbox. Ich möchte die beobachteten Daten des Eingabefelds in einer berechneten Observablen verwenden, aber wenn das beobachtbare Textfeld mit der Formatierung geändert wird, wird die Formatierung auch in der Variablen gespeichert.

Wie kann ich den Wert des Eingabefeldes nur ohne Formatierung beobachten?

Ich denke, der beste Weg zu diesem könnte ein Getter/Setter für die Observable sein, und entfernen Sie die Formatierung, wenn der Wert festgelegt ist. Ich konnte keine Lösung in der KO-Dokumentation finden, um get/set-Methoden für ko.observable() zu schreiben, und ko.computed() kann keinen Wert speichern.

Ich möchte nicht versteckte Felder oder zusätzliche Variablen verwenden.
Ist das ohne es möglich?

Antwort

3

Lösung, wie auf http://knockoutjs.com/documentation/extenders.html gesehen

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; 
}; 

Und später

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

Dies erzeugt auch eine zusätzliche Variable ('result = ko.computed (...)') – mhu

+0

, aber nicht im Viewmodel. – zeal

1

Sie können dafür ko.computed() verwenden. Sie können eine Schreiboption angeben, siehe Writeable computed observables

Beispiel (aus Knockout-Dokumentation entnommen):

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

wie ich sagte "ko.computed() kann keinen Wert speichern" – zeal

+0

ich möchte AV oid erstellt auch mehr Variablen. keine Antwort. – zeal

+0

Aber wenn Sie die Schreiboption verwenden, ** ** können Sie einen Wert speichern. Haben Sie die Dokumentation gelesen? – mhu

Verwandte Themen