📄 valuesmanager.js
字号:
// Assume onely one fileItem per member form - on saveData(), we'll grab the fileItemForm // from our member form and use it to submit all our values. getFileItemForm : function () { var hasFileItemForm = false, fileItemForm; for (var i = 0; i < this.members.length; i++) { var form = this.members[i].getFileItemForm(); if (form) { if (hasFileItemForm) { this.logWarn("ValuesManager defined with more than one member form " + " containing a FileItem. This is not supported - binary data may " + "only be uploaded from one FileItem when saving ValuesManager data"); } else { fileItemForm = form; hasFileItemForm = true; } } } return fileItemForm; }, // Validation: //> @method valuesManager.validate() // Validate the current set of values for this values manager against validators defined // in the member forms. For databound valuesManagers, also perform validation against any // validators defined on datasource fields. // <P> // Note that if validation errors occur for a value that is not shown in any member forms, // those errors will cause a warning and +link{handleHiddenValidationErrors()} will be // called. This can occur if:<br> // - A datasource field has no correspending item in any member form<br> // - The item in question is hidden<br> // - The member form containing the item is hidden. // // @return (boolean) true if all validation passed // @visibility external // @example formSplitting //< validate : function () { // Just bail if client-side validation is disabled. // Note that we'll still show the errors returned from a failed server save due to // 'setErrors' behavior if (this.disableValidation) return true; // clear hidden errors before starting any validation run this.clearHiddenErrors(); // For databound valuesManagers, each member form will be responsible for validating // the fields it shows, and the valueManager will validate the rest. var returnVal = true, // fields are returned from ds in {fieldName:fieldObject} format dsFields = this.dataSource ? isc.addProperties({}, this.getDataSource().getFields()) : null, validators = {}; // First go through all the member forms and perform validation. if (this.members) { for (var i = 0; i < this.members.length; i++) { var form = this.members[i], items = this.members[i].getItems(); // we don't want any user-defined handleHiddenValidationErrors to fire on the // form - instead well fire this method at the valuesManager level only. // Implement this by applying our own 'handleHiddenValidationErrors' method to // the form that notifies us what the errors were. if (form.handleHiddenValidationErrors != null) { this.logInfo("form level 'handleHiddenValidationErrors' method suppressed " + "in favor of valuesManager level handler", "validation"); form._prevHHVE = form.handleHiddenValidationErrors; } form.handleHiddenValidationErrors = this._handleHiddenFormErrors; for (var j = 0; j < items.length; j++) { var fieldName = items[j].getFieldName(); // IF the form shares a dataSource with this VM instance, // remove the appropriate field from our copy of the dataSource fields - // we have already validated this value. if (dsFields && this.members[i].getDataSource() == this.getDataSource()) delete dsFields[fieldName]; } // Allow the form to perform its own validation. // Validate hidden fields (makes sense since we validate hidden forms!) // Pass the additional param to suppress validating DS fields for which there // are no items though, since we handle these at the VM level. // This will also display validation errors, or fire the method to handle // validation errors while hidden. var formSuccess = form.validate(true, true) returnVal = (returnVal && formSuccess); if (form._preHHVE) form.handleHiddenValidationErrors = form._preHHVE; else delete form.handleHiddenValidationErrors; // If the form is hidden, add its full set of errors to our hidden form // validation errors object. // Note that if there were fields marked as hidden within the form, we already // stored those -- this will override that object with the entire set of // errors for the form. if (!formSuccess && !(form.isDrawn() && form.isVisible())) { this.addHiddenErrors(form.errors, form) } } } // we now have to perform validation on the DS fields not present in any member form var values = this.getValues(), errors = {}; for (var fieldName in dsFields) { var fieldObject = dsFields[fieldName], validators = fieldObject.validators, required = fieldObject.required, value = values[fieldName]; if (required && value == null) { // handle this type of error if (errors[fieldName] == null) errors[fieldName] = []; errors[fieldName].add(isc.Validator.requiredField); } else if (validators != null) { var value = values[fieldName]; // iterate through the validators again, this time actually checking each one for (var i = 0; i < validators.length; i++) { // validators is an array of validator objects, each of which has the form // {type:"validatorType", errorMessage:"message", optionalParam:"", ...} var validator = validators[i]; if (!validator) continue; // Unless we're looking at a 'requiredIf' field, don't try to validate // null values. if (validator.type != "requiredIf" && value == null) { continue; } // we have no item, so pass the field object to processValidator() // This roughly matches what we do in ListGrid validation if (!this.processValidator(fieldObject, validator, value)) { if (errors[fieldName] == null) errors[fieldName] = []; var errorMessage = validator.errorMessage || this.unknownErrorMessage; errors[fieldName].add(errorMessage); } } } // for consistency with forms - if we got a single error, store as a string, not // a single element array if (errors[fieldName] && errors[fieldName].length == 1) errors[fieldName] = errors[fieldName][0]; } // add hidden errors from fields that are not associated with any form. this.addHiddenErrors(errors); // This method will show hidden errors from member forms or from the VM fields. this._handleHiddenValidationErrors(true); if (isc.getKeys(errors).length > 0) returnVal = false; return returnVal; }, //> @method ValuesManager.getValidatedValues() // Call +link{valuesManager.validate()} to check for validation errors. If no errors are found, // return the current values for this valuesManager, otherwise return null. // @return (object|null) current values or null if validation failed. // @group errors // @visibility external //< getValidatedValues : function () { if (!this.validate()) return null; return this.getValues(); }, // Handler for hidden form validation errors. This method is applied directly to the // member form _handleHiddenFormErrors : function (errors) { var vm = this.valuesManager; vm.addHiddenErrors(errors, this); return false; // suppress the standard warning }, clearHiddenErrors : function () { delete this.hiddenErrors; }, // addHiddenErrors() // For a valuesManager, hidden validation errors may come from: // - a field in the dataSource not associated with any member form item // - a hidden item in a member form // - a hidden or undrawn member form. addHiddenErrors : function (errors, form) { if (errors == null || isc.isAn.emptyObject(errors)) return; if (!this.hiddenErrors) this.hiddenErrors = {}; if (form) { if (isc.isA.Canvas(form)) form = form.getID(); } else form = this.getID(); if (!this.hiddenErrors[form]) this.hiddenErrors[form] = {}; for (var fieldName in errors) { this.hiddenErrors[form][fieldName] = this._addFieldErrors(this.hiddenErrors[form][fieldName], errors[fieldName]); } }, // Returns the current snapshot of hidden errors in a flat list getHiddenErrors : function (suppressSynch) { if (!suppressSynch) { this.synchHiddenErrors(); } if (!this.hiddenErrors) return null; var flatErrors = {}; for (var form in this.hiddenErrors) { isc.addProperties(flatErrors, this.hiddenErrors[form]); } return flatErrors; }, // synchHiddenErrors() // This is a method to ensure that our 'hiddenErrors' object returned by getHiddenErrors() // and passed to handleHiddenValidationErrors is in synch with the current set of // visible forms / items. // Required in the case where // - setErrors() was called, // - form/item visibility was changed, // - showErrors() called. synchHiddenErrors : function () { var hiddenErrors = this.hiddenErrors, vmID = this.getID(); // Logic for errors that occurred on fields with no associated member form item // (when errors were stored) if (hiddenErrors && hiddenErrors[vmID]) { for (var field in hiddenErrors[vmID]) { var errors = hiddenErrors[vmID][field], item = this.getItem(field), memberForm = item ? item.form : null; // If there is now an associated member form item, we need to add the // field error to the form, and update this.hiddenErrors if (item) { memberForm.addFieldErrors(field, errors); // clear out the hidden error under the valuesManager's ID - the error // is now associated with a form. delete hiddenErrors[vmID][field]; } } } // Update hidden errors for each form. // Quickest to just re-generate hidden errors per form rather than trying to synch with // existing stored hiddenErrors object. var vmErrors = hiddenErrors[vmID]; hiddenErrors = this.hiddenErrors = {}; if (vmErrors) hiddenErrors[vmID] = vmErrors; // Now iterate through every member's errors and add to hidden members arrays if // necessary if (this.members) { for (var i = 0; i< this.members.length; i++) { var member = this.members[i], memberID = member.getID(), memberErrors = member.errors; if (!memberErrors || isc.isAn.emptyObject(memberErrors)) continue; // shortcut - if the form is hidden always store all its errors. This may // overwrite an already up to date this.hiddenErrors[formID] but is quicker // than iterating through the errors doing comparisons. if (!member.isVisible() || !member.isDrawn()) { memberErrors = isc.addProperties({}, memberErrors); hiddenErrors[memberID] = memberErrors; } else { // catch items that have been hidden or removed for (var field in memberErrors) { var item = member.getItem(field); if (!item) { if (!hiddenErrors[vmID]) hiddenErrors[vmID] = {}; hiddenErrors[vmID][field] = memberErrors[field]; // just delete the field from the form's errors object delete memberErrors[field]; } else if (!item.visible) { if (!hiddenErrors[memberID]) hiddenErrors[memberID] = {}; hiddenErrors[memberID][field] = memberErrors[field]; } } } } } },
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -