3 Stimmen

Auswertung "true" läuft, auch wenn der Wert falsch ist

Ich habe ein sehr einfaches Stück von Jquery, die einen booleschen Wert von einem Ajax-Aufruf zurückgegeben und ein Kontrollkästchen zu überprüfen muss, wenn es wahr ist.

console.log("loc: " + r.location.defaultLocation);
if( r.location.defaultLocation == true ) {
    $('#loc-default').attr('checked',true);
}

Dies wird in einer Onclick-Funktion ausgeführt, die ein modales Formular öffnet - wenn die zurückgegebene Ortsangabe angibt, dass dies der Standardort ist, sollte das Kontrollkästchen aktiviert werden. Wir haben 5 davon auf einer einzigen Seite - d.h. 5 Orte, die der Benutzer anklicken kann.

Ich habe das Problem, dass selbst wenn r.location.defaultLocation false zurückgibt (laut der console.log-Zeile), wird das Kontrollkästchen immer noch aktiviert. Was mache ich falsch?

Für diejenigen unter Ihnen, die darauf bestehen, dass true/false ein String und kein Boolean sein muss:

Dies ist das Ergebnis von console.info(typeof(r.location.defaultLocation));

enter image description here

Und dies ist das Ergebnis von console.dir(r) falls das hilft. ( group ist unscharf, weil es sich um sensible Informationen handelt.)

enter image description here

DAS PROBLEM GEFUNDEN

Anscheinend merkt sich jquery das #loc-default wird geprüft, nachdem die erste als geprüft markiert wurde. Ich habe der Funktion ein else hinzugefügt, und jetzt funktioniert es:

if( r.location.defaultLocation == true ) {
    $('#loc-default').attr('checked',true);
}
else {
    $('#loc-default').attr('checked', false);
}

3voto

DNS Punkte 35625

Die einzige Möglichkeit, die ich sehen kann, dass geschieht, ist, wenn defaultLocation nicht tatsächlich die boolesche false, aber stattdessen die Zeichenfolge "false", die als wahr ausgewertet wird.

2voto

drmonkeyninja Punkte 8457

Vergewissern Sie sich r.location.defaultLocation ist ein Boolescher Wert.

Pruebe if (!!r.location.defaultLocation) {} um zu erzwingen, dass der Wert vom Typ Boolean ist.

2voto

Magus Punkte 14698

Ich denke r.location.defaultLocation ist die String "false" . Wenn Sie also console.log darauf, sehen Sie "false" . Aber "false" == true wahr ist.

Sie können den Typ einer Variablen mit typeof .

console.log(typeof r.location.defaultLocation); // Log the current type of r.location.defaultLocation
console.log(typeof false); // Display boolean
console.log(typeof "false"); // Display string

1voto

Kenji Punkte 522

Da Ihr Code korrekt zu sein scheint, würde ich versuchen, die else-Anweisung zu bearbeiten und zu erzwingen, dass das Kontrollkästchen nicht aktiviert wird.

if( r.location.defaultLocation == true ) {
    $('#loc-default').attr('checked',true);
} else {
    $('#loc-default').attr('checked',false);
}

0voto

Jamie Hutber Punkte 24382

Zunächst einmal würde ich prüfen, was r.location.defaultLocation es

 console.info(typeof(r.location.defaultLocation));

Dann würde ich von dort aus weitermachen, aber mit obigem Code:

 if (!!r.location.defaultLocation && typeof(r.location.defaultLocation)==="string") {}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X