2014-09-03 39 views
1

我想寫我的輸入字段值的驗證。 如果該值是錯誤的,那麼我想設置一個默認值。 不幸的是,它正在檢查它,設置默認值,然後設置錯誤的值。 我正在嘗試使用擴展驗證。在我嘗試使用「訂閱」之前,卻又沒有成功。這裏是我的例子場景驗證輸入值,如果它是錯誤的比設置默認

在輸入開始我有0.56 我改變它爲0.95。因此,擴展程序檢查0.95是否超過0.85,並將值更改爲0.85。不幸的是在我的情況下仍然是0.95。我增加了一些警告後目標(0.85)我可以看到價值正在改變爲0.85,但之後又是0.95。

任何想法我做錯了什麼?

這裏是我的代碼

ko.extenders.checkInput = function (target) { 

    var result = ko.computed({ 
     read: target, 
     write: function (newValue) { 

      if (newValue > 0.85) { 
       target(0.85); 
      } 

     }); 

    //return the new computed observable 
    result(target()); 

    return result; 


}; 

self.inputValue = ko.observable(0.56).extend({ checkInput: '' }); 
+1

除從丟失的括號中,這似乎工作正常,請參閱http://jsfiddle.net/a75oqxtw/ – sroes 2014-09-03 09:38:58

+0

如果它的寫就像是工作。不幸的是,當我在前端輸入字段時,它不起作用 – Kosmonaft 2014-09-03 10:05:05

+0

您可以嘗試使用http://jsfiddle.net重現您的情況。我想也許你沒有在輸入中使用擴展的觀察值。 – sroes 2014-09-03 10:10:43

回答

1

您需要使用notifySubscribers如果該值不改變和擴展計算總是通知有關的變化(如每knockout documentation on extenders):

ko.extenders.checkInput = function(target, option) { 
    var result = ko.computed({ 
     read: target, 
     write: function(newValue) { 
      var current = target(), 
      valueToWrite = Math.min(newValue, 0.85); 
      if (valueToWrite !== current) { 
       target(valueToWrite); 
      } else { 
       if (newValue !== current) { 
        target.notifySubscribers(valueToWrite); 
       } 
      } 
     } 
    }).extend({ notify: 'always' }); 
    result(target()); 

    return result; 
}; 

http://jsfiddle.net/w017dc50/

+0

Hi @Jerry。非常感謝你。在CodePen中工作。所以我會像回答一樣檢查你的帖子。不幸的是,在我的解決方案中,並不是因爲我有一個自定義綁定來顯示此值。不幸的是,自定義綁定不起作用(請檢查[CodePen](http://codepen.io/anon/pen/ovKkg)) – Kosmonaft 2014-09-03 11:59:34

+0

快速查看,但似乎與您的自定義綁定有一個單獨的問題。我認爲init部分中的ko.utils.registerEventHandler與更新藝術ifself之間存在衝突(您不需要這兩者)。 – Jerry 2014-09-03 12:33:36

+1

回到家,又看了一眼。看到這個:http://codepen.io/anon/pen/hknJs – Jerry 2014-09-03 19:07:53

0

如果該值通過驗證你沒有更新target。試試這個:

ko.extenders.checkInput = function (target) { 

    var result = ko.computed({ 
     read: target, 
     write: function (newValue) { 
      target(Math.min(newValue, 0.85)); 
     } 
    }); 

    //return the new computed observable 
    result(target()); 

    return result; 
}; 
+0

我仍然有同樣的問題。第一次更新,但後來不是@Jerry已經共享一個工作解決方案。 – Kosmonaft 2014-09-03 11:55:45

相關問題