2016-05-05 8 views
0

Ich habe einige Extender-Code, den ich gerne gleichzeitig verwenden könnte. Das Problem ist nicht funktionieren, wenn ich versuche, Numerisch mit Bereich zu erweitern.Knockout-Extender nicht gleichzeitig

ko.extenders.numeric = function (target, precision) { 
      //create a writable computed observable to intercept writes to our observable 
      var result = ko.pureComputed({ 
       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); 
         } 
        } 
       } 
      }).extend({ notify: 'always' }); 

      //initialize with current value to make sure it is rounded appropriately 
      result(target()); 

      //return the new computed observable 
      return result; 
     }; 

Hier ist eine weitere Verlängerung ist ...

ko.extenders.range = function (target, intRange) { 
     //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) { 
       alert(target()); 
       var current = target(), 
        newValueAsNum = isNaN(newValue) ? 0 : parseInt(+newValue, 10), 
        valueToWrite = newValueAsNum; 

       if (newValueAsNum < intRange.min) { 
        valueToWrite = intRange.min; 
       } 

       if (newValueAsNum > intRange.max) { 
        valueToWrite = intRange.max; 
       } 
       //only write if it changed 
       if (valueToWrite !== current) { 
        target(valueToWrite); 
       } else { 
        //if the tested value is the same, but a different value was written, force a notification for the current field 
        if (newValue !== current) { 
         target.notifySubscribers(valueToWrite); 
        } 
       } 
      } 
     }).extend({ notify: 'always' }); 

     //initialize with current value to make sure it is rounded appropriately 
     result(target()); 

     //return the new computed observable 
     return result; 
    }; 

Hier ist meine Geige https://jsfiddle.net/xequence/0nL09w55/

Hier wird der säumige Implementierung

var InitializePanelsApplicantViewModel = function() { 
     this.CoverageLimit = ko.observable('').extend({required: true}).extend({numeric: 2}), 
     this.CoverageLimitFailWhyCry = ko.observable('').extend({required: true}).extend({numeric: 2}).extend({range : 500}); 
     };   

     $(function(){ 
var masterVM = (function() { 
this.InitializePanelsApplicantViewModel = new InitializePanelsApplicantViewModel(); 
})(); 

ko.applyBindings(masterVM); 
}); 

Antwort

2

Bitte this fiddle sehen was ich denke, zeigt die Verhalten, das du willst.

Ich habe das Beispiel ein wenig und machte folgende Änderungen vereinfacht:

  • Der Range Extender ein Objekt mit min und max Eigenschaften erwartet. Ich habe dies geändert, so dass Aufrufe an extend Objekte übergeben, anstatt nur einen numerischen Wert.

  • Der numerische Extender verwendet ko.pureComputed nicht ko.computed. Da die Funktion Nebenwirkungen hat, sollten Sie ko.computed verwenden. Weitere Informationen hierzu finden Sie unter .

  • Der Bereichs-Extender verwendete parseInt, der jede Rundung im numerischen Extender außer Kraft setzt. Beide verwenden jetzt parseFloat.

+0

Vielen Dank für die Klärung, dass ich parseInt und nicht parseFloat verwendet habe. Was die pureComputed anbelangt, war sie im Moment etwas zu neu für mich und hätte deinen Vorschlag von ko.computed verwenden sollen. – Programmer