2013-12-09 34 views
1

我有以下情形:淘汰賽驗證 - isValid()的始終真值變化後

function ViewModel(){ 

    var self = this; 

    self.newQty = ko.observable().extend({   
     pattern: { 
      message: "Wrong!", 
      params: new RegExp("^[1-9][0-9]*(\\,\\d{1,2})?|0+\\,\\d{1,2}$") 
     } 
    }); 

    self.newQty.subscribe(function() { 
     if(self.newQty.isValid()) 
      doStuff(); 
    }) 
} 

newQty字段綁定到一個input元素。

如果鍵入 「123」 到input盒,isValid()的計算結果爲true,並且如果I型 「ASD」 入input框中isValid()計算結果爲false

當我將「123」更改爲「123a」時,問題就體現出來了。 isValid()仍然評估爲真。

我的問題是:有沒有辦法手動強制重新評估字段newQty?我發現一些帖子,呼籲valueHasMutated(),但我得到Maximum call stack size exceeded錯誤,當我使用它。

我使用Knockout 2.3.0和最新版本的Knockout-validation插件。

謝謝!

回答

1

問題是,你不是逃避你的改變(|)。如果您添加括號它應該工作:

params: new RegExp("^([1-9][0-9]*(\\,\\d{1,2})?|0+\\,\\d{1,2})$") 

你可以在瀏覽器控制檯測試:

'1234a'.test(/^[1-9][0-9]*(\\,\\d{1,2})?|0+\\,\\d{1,2}$/) //returns true 
'1234a'.test(/^([1-9][0-9]*(\\,\\d{1,2})?|0+\\,\\d{1,2})$/) //returns false 
+0

非常感謝你。我花了很多時間找錯方向。我能說什麼,正則表達式就像我的魔術:) – marac

+0

沒問題 - Regexpal.com是一個很好的測試這些東西的地方。 (我與該網站沒有任何關係,多年來一直使用它)。 – ach