2016-05-05 9 views
0

私は、同時に使用できるエクステンダコードをいくつか持っています。 Numeric with Rangeを拡張しようとすると、問題は解決されません。ここでノックアウトエクステンダが同時に動作しない

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

は別のエクステンダーです...ここで

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

は私のバイオリンは、ここでhttps://jsfiddle.net/xequence/0nL09w55/

ある問題の実装

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

答えて

2

である私が示したと思われthis fiddleを参照してください。あなたが望む行動。

Iは例を少し簡略化し、以下の変更を加えた:

  • レンジエクステンダはminmaxプロパティを持つオブジェクトを期待しています。これを変更して、extendへの呼び出しが単なる数値ではなくオブジェクトを渡すようにしました。

  • 数値エクステンダはko.pureComputedではなく、ko.computedです。関数には副作用があるので、私はko.computedを使うべきだと思います。詳しくはknockout.js docs pageをご覧ください。

  • 範囲エクステンダはparseIntを使用していました。これは数値エクステンダで行われた丸めを無効にします。どちらも現在parseFloatを使用しています。

+0

私がparseIntを使用していて、parseFloatを使用していないことを明確にしていただきありがとうございます。 pureComputedに関しては、それは現時点では私にとって新しく、ko.computedの提案を使用していたはずです。 – Programmer

関連する問題