The explicit binding feature in 2.2.0 is quite useful in building highly 
scalable dynamic pages,
however our validation story isn't as complete as I'd like it to be. Today I've 
helped a colleague
building a fairly sophisticated dynamic form, and one issue we ran into was 
that Click Fields bind
and validate their values *even* for dynamically added fields which did not 
partake in the current
post request. In other words the newly added fields does not have a request 
parameter. We ended up
conditionally toggling form validation, but the default value we assigned in 
the onInit gets
overridden by the binding, forcing us to set default value in the onRender. 
This process wasn't
smooth as I've hoped, so I looked at the Field source code for ways to improve 
the behavior, and
think I've found a way.

Field#onProcess() looks like this:

        bindRequestValue();
        if (getValidate()) {
            validate();
        }
        dispatchActionEvent();


So whether the field has an incoming request parameter or not, its value is 
bound to it's request
parameter. And validation will occur unless explicitly set to false. So the 
idea is to wrap the
above code like this:


  if (getContext().hasParameter(getName()) {
    bindRequestValue();
    if (getValidate()) {
      validate();
    }
  dispatchActionEvent();
}

This nicely sidesteps the issue we ran into today. Only submitted fields will 
be validated, and
Field's default values set in onInit is left as is.

Maybe there is a reason for the current behavior that I'm missing?

Bob

Reply via email to