0

我正在使用KnockoutJS 3.2.0以及最新的Knockout-Validation和映射。 Controller向我發送一個來自Model的複雜JSON對象。 許多人認爲工作很好。現在我得到了第一個更大的問題,直到現在我無法解決自己。 我得到了擴展器,它將我的價值轉換爲歐元字符串。和我自己的(或驗證'最大')擴展器來檢查值。 任何人都可以告訴我我犯了什麼樣的錯誤嗎? 我在HTML中直接使用我的擴展器。我不會手動設置擴展程序。與自定義擴展程序和驗證的敲除綁定

我試着爲你製作一個非常簡單的例子。 類型150>顯示錯誤>類型100>應該隱藏錯誤。

我更新了代碼。現在錯誤通知工作正常。但該模型仍然有效。

ko.validation.rules['maxval'] = { 
 
    validator: function (val, otherVal) { 
 
     var nbr ; 
 
      if(ko.validation.utils.isNumber(val)) 
 
      { 
 
       nbr = val;    
 
      } 
 
      else 
 
      { 
 
       nbr=val.split('€')[0] 
 
      } 
 
     return nbr <= otherVal; 
 
    }, 
 
    message: 'Number should greater than or equal to {0} €' 
 
}; 
 
ko.extenders.euro = function (target, precision) {     
 
       var result = ko.dependentObservable({ 
 
        read: function() { 
 
         //sample      
 
         if(target().toString().indexOf('€') != -1) { 
 
          return target() ;} 
 
         else{ 
 
          return target() +" €";} 
 
        }, 
 
        write: target 
 
       }).extend({ 
 
        notify: 'always' 
 
       }); 
 
       result.raw = target; 
 
       return result; 
 
      }; 
 
ko.validation.registerExtenders(); 
 
var data = { num : 100}; 
 
var viewModel = ko.validatedObservable(ko.mapping.fromJS(data)); 
 
ko.applyBindings(viewModel);
label { display: block; margin-top: 5px }
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 
<script src="https://raw.githubusercontent.com/SteveSanderson/knockout.mapping/master/build/output/knockout.mapping-latest.js"></script> 
 
<script src="https://raw.githubusercontent.com/Knockout-Contrib/Knockout-Validation/master/dist/knockout.validation.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 

 
<fieldset> 
 
    <label>work: <input data-bind="value: num.extend({ euro : 2,maxval : 130})" /></label> 
 
    <label>work: <input data-bind="value: num.extend({ maxval : 130})" /></label> 
 
</fieldset> 
 

 
<div> 
 
    <button type="button" data-bind='enable: isValid()'>Submit</button> 
 
    <label>button still valid</label> 
 
</div>

感謝

+0

我只是修改腳本引用它似乎是工作精細檢查這裏http:// jsfi ddle.net/supercool/LkqTU/22458/。除此之外,你在尋找什麼? – 2015-02-05 16:10:20

+0

嗯。我看不出有什麼不同。你改變了什麼? – 2015-02-05 19:05:17

+0

嗯,我做了一個腳本源代碼的改變。您使用的gifthub我正在使用cdn。那麼你能解釋一下你的問題究竟發生了什麼: – 2015-02-06 13:58:36

回答

1

那麼你應該是onLoad的調用您的文本框的值不是數字(100€)這裏要注意,你正試圖以比較使用max:130一些讓你總是假。

使用自定義的驗證,我們可以處理這個問題的有效

自定義驗證規則:

ko.validation.rules['maxval'] = { 
    validator: function (val, otherVal) { 
     var nbr ; 
     if(val) { 
     nbr=val.split('€')[0] 
     } 
     return nbr <= otherVal; 
    }, 
    message: 'Number should greater than or equal to {0} €' 
}; 

注:值 '130' 是第二ARG( 'otherVal')是傳遞給驗證人

註冊規則創建人:

ko.validation.registerExtenders(); 

視圖模型:

ko.extenders.euro = function (target, precision) {     
       var result = ko.dependentObservable({ 
        read: function() { 
         //sample      
         if(target().toString().indexOf('€') != -1) { 
          return target() ;} 
         else{ 
          return target() +" €";} 
        }, 
        write: target 
       }).extend({ 
        notify: 'always' 
       }); 
       result.raw = target; 
       return result; 
      }; 

var data = { num : 100}; 
var viewModel = ko.validatedObservable(ko.mapping.fromJS(data)); 
ko.applyBindings(viewModel); 

工作撥弄here

有關KO驗證文件refer here

+0

該示例工作正常,謝謝。我有這樣的事情,但更醜陋。明天我會適應我的工作,並將發佈並標記爲答案! – 2015-02-06 16:17:35

+0

酷你的歡迎。還有一個也是值得欣賞的強悍LOL。歡呼 – 2015-02-06 16:20:59

+0

我更新了代碼。現在錯誤通知工作正常。但該模型仍然有效。我使用我的ko驗證文件。我認爲這並不重要。有任何想法嗎? – 2015-02-09 08:04:13

相關問題