TEMP - trying to remove watches to figure out the angular infinite digest loop

This commit is contained in:
Shannon
2018-08-03 10:49:19 +10:00
parent 789a9434c1
commit fdf0182ffe
3 changed files with 66 additions and 68 deletions

View File

@@ -44,34 +44,34 @@ function valFormManager(serverValidationManager, $rootScope, $log, $timeout, not
},
link: function (scope, element, attr, formCtrl) {
//watch the list of validation errors to notify the application of any validation changes
scope.$watch(function () {
//the validators are in the $error collection: https://docs.angularjs.org/api/ng/type/form.FormController#$error
//since each key is the validator name (i.e. 'required') we can't just watch the number of keys, we need to watch
//the sum of the items inside of each key
////watch the list of validation errors to notify the application of any validation changes
//scope.$watch(function () {
// //the validators are in the $error collection: https://docs.angularjs.org/api/ng/type/form.FormController#$error
// //since each key is the validator name (i.e. 'required') we can't just watch the number of keys, we need to watch
// //the sum of the items inside of each key
//get the lengths of each array for each key in the $error collection
var validatorLengths = _.map(formCtrl.$error, function (val, key) {
return val.length;
});
//sum up all numbers in the resulting array
var sum = _.reduce(validatorLengths, function (memo, num) {
return memo + num;
}, 0);
//this is the value we watch to notify of any validation changes on the form
return sum;
}, function (e) {
scope.$broadcast("valStatusChanged", { form: formCtrl });
// //get the lengths of each array for each key in the $error collection
// var validatorLengths = _.map(formCtrl.$error, function (val, key) {
// return val.length;
// });
// //sum up all numbers in the resulting array
// var sum = _.reduce(validatorLengths, function (memo, num) {
// return memo + num;
// }, 0);
// //this is the value we watch to notify of any validation changes on the form
// return sum;
//}, function (e) {
// scope.$broadcast("valStatusChanged", { form: formCtrl });
//find all invalid elements' .control-group's and apply the error class
var inError = element.find(".control-group .ng-invalid").closest(".control-group");
inError.addClass("error");
// //find all invalid elements' .control-group's and apply the error class
// var inError = element.find(".control-group .ng-invalid").closest(".control-group");
// inError.addClass("error");
//find all control group's that have no error and ensure the class is removed
var noInError = element.find(".control-group .ng-valid").closest(".control-group").not(inError);
noInError.removeClass("error");
// //find all control group's that have no error and ensure the class is removed
// var noInError = element.find(".control-group .ng-valid").closest(".control-group").not(inError);
// noInError.removeClass("error");
});
//});
//This tracks if the user is currently saving a new item, we use this to determine
// if we should display the warning dialog that they are leaving the page - if a new item

View File

@@ -16,7 +16,7 @@ function valPropertyMsg(serverValidationManager) {
replace: true,
restrict: "E",
template: "<div ng-show=\"errorMsg != ''\" class='alert alert-error property-error' >{{errorMsg}}</div>",
scope: {},
link: function (scope, element, attrs, ctrl) {
//the property form controller api
@@ -28,7 +28,7 @@ function valPropertyMsg(serverValidationManager) {
//the tabbed content controller api
var tabbedContent = ctrl[3];
var currentProperty = umbPropCtrl.property;
scope.currentProperty = umbPropCtrl.property;
var currentCulture = tabbedContent.content.language.culture;
var watcher = null;
@@ -36,16 +36,16 @@ function valPropertyMsg(serverValidationManager) {
// Gets the error message to display
function getErrorMsg() {
//this can be null if no property was assigned
if (currentProperty) {
if (scope.currentProperty) {
//first try to get the error msg from the server collection
var err = serverValidationManager.getPropertyError(currentProperty.alias, null, "");
var err = serverValidationManager.getPropertyError(scope.currentProperty.alias, null, "");
//if there's an error message use it
if (err && err.errorMsg) {
return err.errorMsg;
}
else {
//TODO: localize
return currentProperty.propertyErrorMessage ? currentProperty.propertyErrorMessage : "Property has errors";
return scope.currentProperty.propertyErrorMessage ? scope.currentProperty.propertyErrorMessage : "Property has errors";
}
}
@@ -61,33 +61,31 @@ function valPropertyMsg(serverValidationManager) {
// the form. Of course normal client-side validators will continue to execute.
function startWatch() {
//if there's not already a watch
if (!watcher) {
watcher = scope.$watch(function () {
return currentProperty.value;
}, function (newValue, oldValue) {
//if (!watcher) {
// watcher = scope.$watch("currentProperty.value", function (newValue, oldValue) {
if (!newValue || angular.equals(newValue, oldValue)) {
return;
}
// if (!newValue || angular.equals(newValue, oldValue)) {
// return;
// }
var errCount = 0;
for (var e in formCtrl.$error) {
if (angular.isArray(formCtrl.$error[e])) {
errCount++;
}
}
// var errCount = 0;
// for (var e in formCtrl.$error) {
// if (angular.isArray(formCtrl.$error[e])) {
// errCount++;
// }
// }
//we are explicitly checking for valServer errors here, since we shouldn't auto clear
// based on other errors. We'll also check if there's no other validation errors apart from valPropertyMsg, if valPropertyMsg
// is the only one, then we'll clear.
// //we are explicitly checking for valServer errors here, since we shouldn't auto clear
// // based on other errors. We'll also check if there's no other validation errors apart from valPropertyMsg, if valPropertyMsg
// // is the only one, then we'll clear.
if ((errCount === 1 && angular.isArray(formCtrl.$error.valPropertyMsg)) || (formCtrl.$invalid && angular.isArray(formCtrl.$error.valServer))) {
scope.errorMsg = "";
formCtrl.$setValidity('valPropertyMsg', true);
stopWatch();
}
}, true);
}
// if ((errCount === 1 && angular.isArray(formCtrl.$error.valPropertyMsg)) || (formCtrl.$invalid && angular.isArray(formCtrl.$error.valServer))) {
// scope.errorMsg = "";
// formCtrl.$setValidity('valPropertyMsg', true);
// stopWatch();
// }
// }, true);
//}
}
//clear the watch when the property validator is valid again
@@ -178,8 +176,8 @@ function valPropertyMsg(serverValidationManager) {
// indicate that a content property is invalid at the property level since developers may not actually implement
// the correct field validation in their property editors.
if (currentProperty) { //this can be null if no property was assigned
serverValidationManager.subscribe(currentProperty.alias, currentCulture, "", function (isValid, propertyErrors, allErrors) {
if (scope.currentProperty) { //this can be null if no property was assigned
serverValidationManager.subscribe(scope.currentProperty.alias, currentCulture, "", function (isValid, propertyErrors, allErrors) {
hasError = !isValid;
if (hasError) {
//set the error message to the server message
@@ -201,7 +199,7 @@ function valPropertyMsg(serverValidationManager) {
// but they are a different callback instance than the above.
element.bind('$destroy', function () {
stopWatch();
serverValidationManager.unsubscribe(currentProperty.alias, currentCulture, "");
serverValidationManager.unsubscribe(scope.currentProperty.alias, currentCulture, "");
});
//checkValidationStatus();

View File

@@ -43,21 +43,21 @@ function valServer(serverValidationManager) {
function startWatch() {
//if there's not already a watch
if (!watcher) {
watcher = scope.$watch(function () {
return modelCtrl.$modelValue;
}, function (newValue, oldValue) {
//watcher = scope.$watch(function () {
// return modelCtrl.$modelValue;
//}, function (newValue, oldValue) {
if (!newValue || angular.equals(newValue, oldValue)) {
return;
}
// if (!newValue || angular.equals(newValue, oldValue)) {
// return;
// }
if (modelCtrl.$invalid) {
modelCtrl.$setValidity('valServer', true);
//clear the server validation entry
serverValidationManager.removePropertyError(currentProperty.alias, currentCulture, fieldName);
stopWatch();
}
}, true);
// if (modelCtrl.$invalid) {
// modelCtrl.$setValidity('valServer', true);
// //clear the server validation entry
// serverValidationManager.removePropertyError(currentProperty.alias, currentCulture, fieldName);
// stopWatch();
// }
//}, true);
}
}