使用 Kendo 网格自定义弹出编辑器模板时添加/编辑表单字段的条件和自定义验证

Conditional and custom validation on Add / Edit form fields when using Kendo grid custom popup editor template

我正在为 kendo 网格弹出添加/编辑表单使用自定义模板。这是我的作品 DEMO

我想对表单字段实施条件验证,例如 如果为地址输入了任何值(不留空),那么城市和邮政编码字段应该成为必填字段,否则他们可以是空的。我还想为 PostCode 设置一个自定义验证规则,使其长度应始终等于 4,否则它应将自定义错误消息显示为 "Postcode must be four digits"

我参考了这些链接:

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' }]
});

如果我要那样做,我会采用这些方法

  1. 我将创建一个自定义验证器
  2. 覆盖编辑(网格)函数,将验证器放在那里
  3. 在保存之前使用 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语句,你可以简化一下我觉得

这是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");
  },
});