使用Kendo网格自定义弹出编辑器模板

时间:2017-08-04 05:03:58

标签: validation kendo-ui kendo-grid kendo-template kendo-validator

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

我想在表格字段上实施条件验证,例如如果为地址输入任何值(不是空的话),那么应该需要“城市和邮政编码”字段,否则它们可以为空。此外,我想要一个PostCode的自定义验证规则,以便其长度应始终等于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' }]
});

2 个答案:

答案 0 :(得分:1)

如果我这样做,我会做这些方法

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

答案 1 :(得分:0)

Here is the DEMO how I implemented it:

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