0

我正在使用kendo网格自定义模板弹出添加/编辑窗体。这是我的工作DEMO使用Kendo网格自定义弹出窗口编辑器模板时添加/编辑表单字段的条件和自定义验证

我想要实现的表单字段,例如条件验证如果输入的地址(不空),那么任何值的字段城市和邮递区号应该成为需要,否则他们可以为空。此外,我想ISE一个自定义的验证规则邮编使得其长度应始终等于4否则它应该显示自定义错误消息“邮编必须是四位”

我刚才提到这些链接:

Validation rules in datasource.model

Custom validation rules and error messages

,但我想不通我怎么能实现我的数据源模型验证?

这里是我的代码:

HTML:

<h3>I want to implement conditional validation on Add/Edit form such as if any value is entered for Address then the fields City and Postal Code should become required</h3> 
<div id="grid"></div> 
<script id="popup-editor" type="text/x-kendo-template"> 
    <p> 
    <label>Name:<input name="name" required /></label> 
    </p> 
    <p> 
    <label>Age: <input data-role="numerictextbox" name="age" required /></label> 
    </p> 

    <p> 
    <label>Address: <input name="address"/></label> 
    </p> 

    <p> 
    <label>City: <input name="city"/></label> 
    </p> 

    <p> 
    <label>Post Code: <input name="postcode"/></label> 
    </p> 
</script> 

JS:

$("#grid").kendoGrid({ 
    columns: [ 
    { field: "name" }, 
    { field: "age" }, 
    { command: "edit" } 
    ], 
    dataSource: { 
    data: [ 
     { id: 1, name: "Jane Doe", age: 30 }, 
     { id: 2, name: "John Doe", age: 33 } 
    ], 
    schema: { 
     model: { id: "id" }, 
     fields: { 
     name:{}, 
     age:{}, 
     address:{}, 
     city:{}, 
     postcode:{}, 
     }, 
    } 
    }, 
    editable: { 
    mode: "popup", 
    template: kendo.template($("#popup-editor").html()) 
    }, 
    toolbar: [{ name: 'create', text: 'Add' }] 
}); 

回答

0

这里是DEMO我是如何实现它:

HTML:

<div id="grid"></div> 
<script id="popup-editor" type="text/x-kendo-template"> 
<div id="myForm"> 
    <p> 
    <label>Name:<input name="name" required /></label> 
    </p> 
    <p> 
    <label>Age: <input data-role="numerictextbox" name="age" required /></label> 
    </p> 

    <p> 
    <label>Address: <input name="address" id="address"/></label> 
    </p> 

    <p> 
    <label>City: <input name="city" id="city"/></label> 
    </p> 

    <p> 
    <label>Post Code: <input name="postcode" id="postcode"/></label> 
    <!--<span class="k-invalid-msg" data-for="postcode"></span>--> 
    </p> 
    </div> 
</script> 

JS:

var validator; 
$("#grid").kendoGrid({ 
    columns: [ 
    { field: "name" }, 
    { field: "age" }, 
    { field: "address" }, 
    { field: "city" }, 
    { field: "postcode" }, 
    { command: "edit" } 
    ], 
    dataSource: { 
    data: [ 
     { id: 1, name: "Jane Doe", age: 30, address:'Addr', city:"city", postcode: '1234' }, 
     { id: 2, name: "John Doe", age: 33, address:'Addr11', city:"city11", postcode: '4321' } 
    ], 
    schema: { 
     model: { id: "id" }, 
     fields: { 
     name:{}, 
     age:{}, 
     address:{}, 
     city:{}, 
     postcode:{}, 
     }, 
    } 
    }, 
    editable: { 
    mode: "popup", 
    template: kendo.template($("#popup-editor").html()) 
    }, 
    toolbar: [{ name: 'create', text: 'Add' }], 
    save: function(e) {//alert('save clicked'); 
    if(!validator.validate()) { 
     e.preventDefault(); 
    } 
    },  
    edit: function(e){ 
    //alert('edit clicked'); 
    validator = $("#myForm").kendoValidator({ 
    messages: { 
     postcode: "Please enter a four digit Postal Code" 
    }, 
    rules: { 
     postcode: function(input) { 
      //console.log(input); 
      if (input.is("[name='address']")) 
      { 
       if (input.val() != '') 
       { 
        $('#city, #postcode').attr('required', 'required'); 
        //return false; 
       } 
       else 
       { 
        $('#city, #postcode').removeAttr("required"); 
       } 
      } 
      else if (input.is("[name='postcode']")) { 
       if ($('#address').val() != '' && input.val().length != 4) 
        return false; 
      } 
      return true; 
     } 
    }, 
}).data("kendoValidator"); 
    }, 
}); 
1

如果我要做到这一点,我会做这些方法,即

  1. 我会节省

这里是一个之前创建一个自定义的验证

  • 覆盖编辑(网格)函数的地方验证有
  • 覆盖保存(网格)函数使用validator.validate()例如,在dojo 基本上是这样的电网代码:

    var validator; 
    $("#grid").kendoGrid({ 
        columns: [ 
        { field: "name" }, 
        { field: "age" }, 
        { command: "edit" } 
        ], 
        dataSource: { 
        data: [ 
         { id: 1, name: "Jane Doe", age: 30 }, 
         { id: 2, name: "John Doe", age: 33 } 
        ], 
        schema: { 
         model: { id: "id" }, 
         fields: { 
         name:{}, 
         age:{}, 
         address:{}, 
         city:{}, 
         postcode:{}, 
         }, 
        } 
        }, 
        save: function(e) { 
        if(!validator.data("kendoValidator").validate()){ 
         e.preventDefault(); 
        } 
        },  
        edit: function(){ 
        validator = $("#test-form").kendoValidator({ 
         validateOnBlur: false, 
         rules: { 
         matches: function(input) { 
    
          var requiredIfNotNull = input.data('test'); 
          // if the `data-test attribute was found` 
          if (requiredIfNotNull) { 
          // get the input requiredIfNotNull 
          var isFilled = $(requiredIfNotNull); 
    
          // trim the values and check them 
          if ($.trim(isFilled.val()) !== "") { 
    
           if($.trim(input.val()) !== ""){ 
           // the fields match 
           return true; 
           }else{ 
           return false; 
           } 
    
          } 
          // don't perform any match validation on the input since the requiredIf 
          return true; 
          } 
    
          // don't perform any match validation on the input 
          return true; 
    
         } 
         }, 
         messages: { 
         email: "That does not appear to be a valid email address", 
         matches: function(input) { 
          return input.data("testMsg"); 
         } 
         } 
        }); 
        }, 
        editable: { 
        mode: "popup", 
        template: kendo.template($("#popup-editor").html()) 
        }, 
        toolbar: [{ name: 'create', text: 'Add' }] 
    }); 
    

    PS:我用很多if语句,你可以把它简化,我认为

  • +0

    谢谢您的回答伴侣这是很大的帮助,所以在UP为你。但是我没有接受它作为答案,因为它仍然错过了邮编长度的自定义验证。无论如何,有了你的提示,我找到了我的解决方案。再次感谢 :) –

    相关问题