2013-02-28 10 views
6

観測値の変更を拒否/取り消す方法はありますか?このよう :観測値の変更を拒否する

observable.subscribe (function (newvalue) { 
    if (newvalue < 0) { 

     // cancel changing 
    } 
    else{ 
     // proceed with change 
    } 

}, this) 

答えて

8

編集:私は何かを見つけ

:書き込み可能な計算観測。ここで

は一例です:

function AppViewModel() { 
    this.field = ko.observable("initValue"); 
    this.computedField = ko.computed({ 
     read: function() { 
      return this.field(); 
     }, 
     write: function (value) { 
      if(value > 0) { 
       this.field(value); 
      } 
     }, 
     owner: this 
    }); 
} 

それではあなたは、計算フィールドにバインドします。

/編集

私はカスタムバインディングを使用します。ここで

がカスタムバインディングのためのチュートリアルです:私は次のように使用し、書き込み値を拒否する助けるために http://knockoutjs.com/documentation/custom-bindings.html

0

http://learn.knockoutjs.com/#/?tutorial=custombindings

またはここではドキュメントです

  • 隠し、観察を作成します。その値を格納します。
  • 隠されたobservableに基づいて書き込み可能な計算可能なobservableを返します。
  • 計算された観測可能物に何かが書き込まれたら、それを受け入れる前にそれを検証します。

私はこのコードでノックアウトを拡張:

ko.conditionedObservable = function (initialValue, condition) { 
    var obi = ko.observable(initialValue); 
    var computer = ko.computed({ 
     read: function() { return obi(); }, 
     write: function (newValue) { 
      //unwrap value - just to be sure 
      var v = ko.unwrap(newValue); 
      //check condition 
      if (condition(v)) { 
       //set it to the observable 
       obi(v); 
      } 
      else { 
       //reset the value 
       computer.notifySubscribers(); 
      } 
     } 
    }); 
    return computer; 
}; 

は次のようにオブジェクトにそれを使用します。

field = ko.conditionedObservable<number>(null, (v) => parseInt(v) > 0); 

以上説明については、私のConditioning Knockout Observables: reject valuesのブログを確認してください。

関連する問題