2016-10-14 3 views
0

Ich habe diesen HTML CodeIf-Anweisung nicht innerhalb Ajax Erfolg arbeiten

<div class="vote"> 
    <div data-post-id="@item.PostId" data-vote-rank="1" class="vote-arrow vote-up glyphicon glyphicon-chevron-up"></div> 
    <div class="total-vote">0</div> 
    <div data-post-id="@item.PostId" data-vote-rank="-1" class="vote-arrow vote-down glyphicon glyphicon-chevron-down"></div> 
</div> 

Und diese jQuery Ajax-Post

$(".vote-arrow").click(function() { 
    var postId = $(this).data("post-id"); 
    var voteRank = $(this).data("vote-rank"); 

    $.ajax({ 
     type: "GET", 
     url: "/Posts/Vote/", 
     data: { postId: postId, voteRank: voteRank }, 
     context: this, 
     success: function() { 
      console.log(voteRank); //working, I get 1 
      if (voteRank === "1") { 
       console.log(voteRank); //nothing in the console 
       $(this).css({ 'color': 'red' }); 
      } 
      alert("working"); 
     } 
    }); 
}); 

If-Anweisung in der success nicht funktioniert.

Wenn ich div mit data-vote-rank="1" drücke, bekomme ich 1 in der Konsole von der console.log außerhalb der if-Anweisung und der alert nach der if-Anweisung. voteRank in der If-Statement-Bedingung ist eins, wenn ich debugge, aber ich bekomme nicht die console.log innerhalb der If-Anweisung (und natürlich nicht Farbänderung).

Was ist los?

+5

überprüfen int Entweder verwenden '==' oder 'voteRank === 1 ', die Identität (' '===) Betreiber auch prüfen Geben Sie an, dass sie übereinstimmen müssen, um als gleich zu gelten – Satpal

+0

Ich denke, dass es wahrscheinlicher ist, dass die Bedingung richtig ausgewertet wird und einfach nicht Ihre Erwartung entspricht, anstatt dass die Bedingung falsch ausgewertet wird. – Jon

+0

Wenn Sie debuggen, was ist der Wert von "voteRank"? Ist es "1" oder ist es "1"? Es hängt davon ab, wie Sie die Datenrequisite * setzen *, weil es den Datentyp behält, dh es ist wahrscheinlich "1" (die Zahl), die ** nicht ** === "1" Text, aber ** tut ** == "1". zB was @Satpal gesagt hat. –

Antwort

3

Entweder verwenden == oder voteRank === 1, die Identität (===) Betreiber auch Typ überprüfen, müssen sie gleich zu betrachten lassen.

Der .data() Wert wird intern in den entsprechenden Datentyp konvertiert. Sie sind keine Zeichenfolge. 1 === "1" wird

0

jQuery konvertiert das Datenattribut in diesem Fall in eine Zahl. Von documentation on .data():

Jeder Versuch wird unternommen, um die Zeichenfolge in einen JavaScript-Wert zu konvertieren (dies umfasst Booleans, Zahlen, Objekte, Arrays und Null). Ein Wert wird nur in eine Zahl konvertiert, wenn dadurch die Darstellung des Werts nicht geändert wird. Zum Beispiel sind "1E02" und "100.000" äquivalent als Zahlen (numerischer Wert 100), aber das Konvertieren würde ihre Darstellung verändern, so dass sie als Strings übrig bleiben. Der String-Wert „100“ auf die 100-Nummer umgewandelt

Sie sollen den Zustand Ihrer ändern, wenn Aussage, dies zu reflektieren:

if (voteRank === 1) { 
    // snip 
} 
0

Haben Sie versucht, das Ergebnis zu konvertieren in int. Sie können parseInt() verwenden, bevor Sie den Wert auf "if" -Bedingung anwenden.

$(".vote-arrow").click(function() { 
    var postId = $(this).data("post-id"); 
    var voteRank = $(this).data("vote-rank"); 
    $.ajax({ 
     type: "GET", 
     url: "/Posts/Vote/", 
     data: { postId: postId, voteRank: voteRank }, 
     context: this, 
     success: function() { 
      console.log(voteRank); //working, I get 1 
      if (parseInt(voteRank) === 1) { 
       console.log(voteRank); //nothing in the console 
       $(this).css({ 'color': 'red' }); 
      } 
      alert("working"); 
     } 
    }); 
}); 
0

Der Identity (===) -Operator verhält sich identisch mit dem Gleichheitsoperator (==), außer dass keine Typkonvertierung durchgeführt wird und die Typen identisch sein müssen, um als gleich zu gelten.

Also vor der Verwendung konvertieren Sie die linke Seite Variablentyp auf die gleiche wie die der rechten Seite. In Ur-Lösung die voteRank Konvertieren

voteRank = parseInt(voteRank, 10); 

dann

if (voteRank) === 1) { 

      }