Сначала давайте остановимся и посмотрим, что на самом деле делает _.find
. Он зацикливается на массиве и возвращает первый элемент массива, соответствующий условию.
_.find([1, 2, 3, 4], function(num) { return num % 2 === 0 });
// returns 2
В случае вашей функции _.find
вы получите либо одно из полей из $rootScope.CustomFields
, либо undefined
, если ни одно из полей не вернет истинное значение из function(field)…
.
Здесь у вас есть проблема. Анонимная функция function(field)…
только когда-либо возвращает false. Вам необходимо возвратить true, если вы обнаружите ошибку, или иначе вернуть false.
Поскольку ваша функция requiredFieldsEntered()
в конечном итоге пытается вернуть либо true
, либо false
, вы можете решить, какой из них вернуть, основываясь на том, возвращает ли ваша функция _.find
какой-либо объект или undefined
.
Примерно так:
$scope.onToggle = function(disposition) {
if (requiredFieldsEntered()===false){
// if return value from the function is false, alert user
}
}
function requiredFieldsEntered(){
const fieldWithErrors = _.find($rootScope.CustomFields,
function(field){
let result = true;
if(field.enabled && field.required){
if(field.table_name === 'session'){
if(!$scope.session.external_id){
console.log(field.column_name);
result = false;
} else if (field.table_name === "session_extension"){
if(!$scope.session.extension|| ($scope.session.extension && !$scope.session.extension[field.column_name])){
console.log(field.column_name);
result = false;
}
}
}
}
return result;
});
if (fieldWithErrors) {
return false;
}
return true;
}
Быстрое замечание, что более короткая, но несколько менее читаемая версия в конце может заменить этот бит:
…
if (fieldWithErrors) {
return false;
}
return true;
}
С:
…
return !!!fieldWithErrors;
Первые два восклицательных знака будут приводить к типу результата вашей функции поиска либо к true
, если он что-то придумывает, либо к false
, если он возвращает undefined
, а затем третий восклицательный знак инвертирует это логическое значение в соответствует вашей текущей схеме возврата false
, если есть ошибки.
(Или вы можете изменить имя вашей функции на errorsArePresent
и вернуть true
- !!fieldWithErrors
).