2015-12-17 16 views
6

Sto confrontando una variabile con un array: $scope.object.id e $scope.groepen.id con un'istruzione if dopo aver usato un ciclo for. Se $scope.object.id è esattamente uguale a uno degli ID di $scope.groepen.id, allora dovrebbe rendere quell'indice di vero.Il looping attraverso array non restituisce il risultato corretto

Sto utilizzando un altro se è stato verificato per verificare se qualcosa di $scope.overlap è vero. Se un elemento di $scope.overlap è true, renderà $scope.bestaand true. Altrimenti dovrebbe renderlo falso.

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; 
    } 
} 

mio log della console mi dimostra che $scope.overlap in effetti mostrano i valori corretti (quindi se non è lo stesso, tutti gli indici sono false). $scope.bestaand diventa vero se qualcosa è uguale, ma non cambia in falso.

che sto usando la validazione dei form angolare per mostrare se il controllo è in funzione o non mostrato qui:

<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> 

Che cosa sto facendo male qui?

Edit:

ho cambiato il luogo della mia se affermazioni. codice aggiornato mostrato qui:

registro
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") 
    } 
} 

La console mi mostra questo:

enter image description here

Sembra che lo fa diventare vero, ma viene sovrascritto (ho in ingresso un valore che è la stessa come secondo valore dell'array). Se inserisco un valore uguale al valore LAST dell'array, funziona.

+0

Il motivo è perché '$ scope.bestaand' dovrebbe probabilmente essere un array all'indice della loop per abbinare ogni '$ scope.overlap' – Tomaltach

risposta

3

Il tuo problema è che hai allegato if ($scope.overlap[i]) { all'interno di if ($scope.object.id === $scope.groepen[i].id) { quindi $scope.overlap sarà sempre vero. Questo significa che $scope.bestaand sarà sempre impostato su true o lasciato come undefined. Che cosa si vuole realmente è -

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; 
    } 
} 

Modifica Se si desidera impostare $scope.bestaand true se uno dei tuoi $scope.overlap elementi è vero allora si vuole qualcosa di un po 'diverso -

$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; 
    } 
    } 
} 
+0

Ho messo il controllo if al di fuori del' if ($ scope.object.id === $ scope.groepen [i] .id) '. Questo mi dà un risultato diverso. '$ scope.bestaand' diventa vero solo se l'ultimo valore di' $ scope.groepen.id' è lo stesso di '$ scope.object.id'. – Johnson

+0

Ho applicato il codice con un po 'di registrazione della console. Quando '$ scope.bestaand' = true, registro" funziona ". Altrimenti registro "non funziona". Nella mia console vedo "non funziona" prima, quindi registra "funziona", quindi 9 volte "non funziona" (probabilmente a causa degli altri oggetti nell'array). – Johnson

+0

@Johnson - Se sto capendo correttamente, si vuole usare '$ scope.bestaand' per essere false se qualche elemento' $ scope.overlap' è vero? –

1

Questo è perché altro affermazione è irraggiungibile:

$scope.overlap[i] = true; 

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

Come per la tua domanda modificata:

Il tuo $scope.bestaand indica un errore, quindi presumo che se è falso una volta non dovrebbe mai essere vero.

quindi è necessario riscrivere il ciclo come segue:

$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; 
    } 
} 
+0

Il mio altro viene raggiunto dopo il test. Ho console registrato entrambi '$ scope.overlap' e' $ scope.bestaand'. Mi mostra tutti i valori di '$ scope.overlap' false se il valore immesso non è uguale a uno degli ID, ma se il valore immesso è lo stesso, $ scope.bestaand' non diventa vero. – Johnson

+0

Deve diventare vero dopo essere diventato falso. Confronto i valori. Se i valori sono uguali, dovrebbe essere vero. Se i valori o non lo sono, dovrebbe diventare falso. In questo modo userò la convalida del modulo Angolare (a meno che non ci sia un modo diverso?). Ho applicato il tuo codice e inoltre non mi sta dando il risultato che sto cercando. – Johnson

0

perché non c'è nessun caso lo si imposta su false. if ($scope.object.id === $scope.groepen[i].id) è vero, allora hai già imposta overlap = true, se sovrapposizione è falso, non si imposta bastaan = false in ogni caso

Problemi correlati