Я сравниваю переменную с массивом: $scope.object.id и $scope.groepen.id с оператором if после использования цикла for. Если $scope.object.id точно такой же, как один из идентификаторов $scope.groepen.id, тогда этот индекс $scope.overlap должен быть истинным.

Я использую другой if, чтобы проверить, правда ли что-либо из $scope.overlap. Если один из элементов $scope.overlap имеет значение true, это сделает $scope.bestaand истинным. Иначе это должно сделать это ложным.

for (var i = 0; i < $scope.groepen.length; i++) {
  if ($scope.object.id === $scope.groepen[i].id) {
    $scope.overlap[i] = true;
    if ($scope.overlap[i]) {
      $scope.bestaand = true;
    }
    else {
      $scope.bestaand = false;
    }
  }
  else {
    $scope.overlap[i] = false;
  }
}

Мой консольный журнал показывает, что $scope.overlap действительно показывает правильные значения (поэтому, если ничего не совпадает, все индексы являются ложными). $scope.bestaand превращается в истину, если что-то такое же, но не возвращается обратно в ложь.

Я использую проверку формы Angular, чтобы показать, работает ли проверка здесь:

<div class="col-md-3" ng-class="{ 'has-error' : bestaand }">
    <label class="control-label" for="textinput">Groepsnaam</label> 
    <input id="groepen" name="groepen" type="text" class="form-control input-md" ng-model="object.id" ng-minlength="4" ng-maxlength="16" ng-change="checkOverlap()" required>
    <p ng-show="bestaand" class="help-block">Deze groepsnaam bestaat al!</p>                            
</div>

Что я здесь делаю не так?

Редактировать:

Я изменил место своих утверждений if. Обновленный код показан здесь:

for (var i = 0; i < $scope.groepen.length; i++) {
  if ($scope.object.id === $scope.groepen[i].id) {
    $scope.overlap[i] = true;
  }
  else {
    $scope.overlap[i] = false;

  }
  if ($scope.overlap[i]) {
      $scope.bestaand = true;
      console.log("works")
  }
  else {
    $scope.bestaand = false;
    console.log("doesnt work")
  }
}

Журнал консоли показывает мне это:

enter image description here

Кажется, что это становится правдой, но это перезаписывается (я ввел значение, которое совпадает со вторым значением массива). Если я введу значение, которое совпадает с последним значением массива, оно работает.

6
Johnson 17 Дек 2015 в 12:38

3 ответа

Лучший ответ

Ваша проблема в том, что вы вложили if ($scope.overlap[i]) { внутрь if ($scope.object.id === $scope.groepen[i].id) {, поэтому $scope.overlap всегда будет верным. Это означает, что $scope.bestaand будет всегда установлен на true или оставлен как undefined. Что вы на самом деле хотите -

for (var i = 0; i < $scope.groepen.length; i++) {
  if ($scope.object.id === $scope.groepen[i].id) {
    $scope.overlap[i] = true;
  }
  else {
    $scope.overlap[i] = false;
  }
  if ($scope.overlap[i]) {
    $scope.bestaand = true;
  }
  else {
    $scope.bestaand = false;
  }
}

< Сильный > Edit Если вы хотите установить для $scope.bestaand значение true, если любой из ваших $scope.overlap элементов имеет значение true, то вам нужно что-то немного другое -

$scope.bestaand = false;
for (var i = 0; i < $scope.groepen.length; i++) {
  if ($scope.object.id === $scope.groepen[i].id) {
    $scope.overlap[i] = true;
  }
  else {
    $scope.overlap[i] = false;
  }
  if(!$scope.bestaand) {
    if ($scope.overlap[i]) {
      $scope.bestaand = true;
    }
  }
}
3
John C 17 Дек 2015 в 10:14

Это потому, что оператор else недоступен:

$scope.overlap[i] = true;

if ($scope.overlap[i]) {
  $scope.bestaand = true;
}
else {
  console.log('UNREACHABLE');
  $scope.bestaand = false;
}

Что касается вашего отредактированного вопроса:

Ваш $scope.bestaand указывает на ошибку, поэтому я предполагаю, что если она ложна, она никогда не должна быть истинной.

Поэтому вам нужно переписать ваш цикл следующим образом:

$scope.bestaand = false;
for (var i = 0; i < $scope.groepen.length; i++) {
  if ($scope.object.id === $scope.groepen[i].id) {
    $scope.overlap[i] = true;
  } else {
    $scope.overlap[i] = false;
  }

  if ($scope.overlap[i] && !$scope.bestaand) {
    $scope.bestaand = true;
  }
}
1
aeryaguzov 17 Дек 2015 в 10:16

Потому что нет случая, чтобы вы установили его в ложь. if ($scope.object.id === $scope.groepen[i].id) имеет значение true, тогда вы уже установили его overlap = true, если перекрытие равно false, вы не установите bastaan = false в любом случае

0
erdysson 17 Дек 2015 в 09:49