Custom validation not being passed a field

4 posts, 0 answers
  1. Troy
    Troy avatar
    34 posts
    Member since:
    Sep 2015

    Posted 19 Mar 2017 Link to this post

    function myValidatorFunc(input) {
        console.log("VFunc: ", input);
        return true;
    };
    ... [model definition] ...
    complexField: {type:"object",
      validation: {myValidator: function(input) {
        console.log("Input length: " + input.length)
        return myValidatorFunc(input);
      }
    }

    I've got something like this in a grid with a custom edit template that lays out various fields.  "complexField" is an array of objects, and while I'm not using fields nested inside that as actual grid columns, the custom editor seems able to bind to them.  So the editor template might have among other fields, something like :

    <input  data-role="numerictextbox" data-bind="value:complexField[0].intSubField1">

    This seems to work, the binding displays and modifies "intSubField1" in element 0 of the data records "complexField" field.  And the  "myValidatorFunc()" function gets called for each field of the template, as expected.  However, for certain fields, the "input" parameter (which is a jquery element) has length 0, instead of 1 (or greater?) - the input element that has just been tabbed out of is not being passed.  So my "intSubField1" example might get passed to the validator, but for "intSubfield2" (done the same way), the valididator gets a 0-length "input" element, and I have nothing to access to do the validation.

    Is there any legitimate case where a validator would get passed a zero-length "input" parameter?  Could this happen if, say, there was a basic HTML5 validator like "required" set?  This isn't the case here, and I would think the custom validator would just not get fired if basic validation failed first.  Firing the validator with no input element to validate seems more like a bug, or lack of support for these sorts of complex bindings.

    I'm trying to create an example on the dojo, but so far I can't get it to fail in a similar fashion - I'm going to keep trying to figure out what in our actual code I might not have translated to the simplistic example.  We're getting this with 2016R3 and 2017R1SP1.  

  2. Troy
    Troy avatar
    34 posts
    Member since:
    Sep 2015

    Posted 20 Mar 2017 Link to this post

    This is the dojo example I'm trying to get to demonstrate the problem, but so far I haven't been able to recreate the 0-length input array being passed to the validator.  I'll update the URL if I can break it in later versions.

  3. Troy
    Troy avatar
    34 posts
    Member since:
    Sep 2015

    Posted 21 Mar 2017 Link to this post

    I think I may have found the problem.  I've updated the dojo example with a simplified template.  We were using a kendo templating expression to index the complexChild array in the data record:

    data-bind="value:complexChild[ #=0# ].estimatedWorkerHours"

    Notice the whitespace before and after the expression "#=0#" (which is a simplistic 'element 0' for this example), which fails to pass the input element to validation.  If the whitespace is removed, validation gets the input element as expected.

    data-bind="value:complexChild[#=1#].estimatedWorkerHours"

    The binding itself seems to work properly in both cases, so there must be some different sort of parsing or selecting happening at validation time that doesn't like the whitespace.  This case in itself may be a bit obscure, but whatever kendo code underlies it may be more widely used and worth fixing.

  4. Konstantin Dikov
    Admin
    Konstantin Dikov avatar
    2466 posts

    Posted 22 Mar 2017 Link to this post

    Hello Troy,

    Although that the syntax with the additional space is valid for accessing array item, with the current implementation you should remove the white spaces in order to get everything to work correctly. On a side note, you could log this as an issue in our public repository:

    Best Regards,
    Konstantin Dikov
    Telerik by Progress
    Try our brand new, jQuery-free Angular 2 components built from ground-up which deliver the business app essential building blocks - a grid component, data visualization (charts) and form elements.
Back to Top