2011-01-11 2 views
0

남자 - 여기서 코드가 왜 파손되는지 알 수 없으며 이유를 알아 내는데 도움이 필요합니다! 아래에서 볼 수있는 함수는 웹 서비스에서 행을 가져오고 반환되는 데이터를 기반으로 테이블 행을 작성합니다. 당신이 볼 수는 2를 표시해야 할 때주석 코드가 이전 코드의 동작을 바꿉니다.

function GetData(id, thisRow) { 
        if (id == 0) { 
         var tier = 0; 
        } 
        else { 
         var currenttier = parseInt(thisRow.find("td.Tier").text()); 
         var tier = currenttier + 1; 
        } 
    //*** this console.log is affected by the for loop that appears later.. 
        console.log(tier); 
        $.ajax({ 
         type: "POST", 
         url: "F2.svc/GetChildTable", 
         data: id, 
         contentType: "application/json; charset=utf-8", 
         dataType: "json", 
         success: function (data, textStatus, xhr) { 

          var tempstring = ""; 
          var temp = ""; 
          if (data.Rows.length > 0) { 
           for (var i = 0; i < data.Rows.length; i++) { 
            tempstring += "<tr class = 'Show Row ItemID-" + data.Rows[i].ItemID + " ParentID-" + data.Rows[i].ItemParentID + " Tier-" + tier + "'>"; 
            tempstring += "<td class='Tier'>"; 
    //*** the loop below seems to break the tier variable declared up above..    
            for (var p = 0; p < tier; p++) { 
             tempstring += "+"; 
            } 
            tempstring += " " + tier; 
            tempstring += "</td>"; 
            tempstring += "<td class='ItemID'>"; 
            tempstring += data.Rows[i].ItemID; 
            tempstring += "</td>"; 
            tempstring += "<td class='ItemParentID'>"; 
            tempstring += data.Rows[i].ItemParentID; 
            tempstring += "</td>"; 
            tempstring += "<td class='ItemDateEntered'>"; 
            tempstring += data.Rows[i].ItemDateEntered; 
            tempstring += "</td>"; 
            tempstring += "<td class='ItemLastUpdated'>"; 
            tempstring += data.Rows[i].ItemLastUpdated; 
            tempstring += "</td>"; 
            tempstring += "<td class='ItemName'>"; 
            tempstring += data.Rows[i].ItemName; 
            tempstring += "</td>"; 
            tempstring += "<td class='ItemStatusID'>"; 
            tempstring += data.Rows[i].ItemStatusID; 
            tempstring += "</td>"; 
            tempstring += "<td class='ItemTasks'>"; 
            tempstring += data.Rows[i].ItemTasks; 
            tempstring += "</td>"; 
            tempstring += "<td class='ItemBlocks'>"; 
            tempstring += data.Rows[i].ItemBlocks; 
            tempstring += "</td>"; 
            tempstring += "<td class='ItemComments'>"; 
            tempstring += data.Rows[i].ItemComments; 
            tempstring += "</td>"; 
            tempstring += "<td class='ItemFilterID'>"; 
            tempstring += data.Rows[i].ItemFilterID; 
            tempstring += "</td>"; 
            tempstring += "<td class='ItemManHoursEst'>"; 
            tempstring += data.Rows[i].ItemManHoursEst; 
            tempstring += "</td>"; 
            tempstring += "<td class='ItemManHoursAct'>"; 
            tempstring += data.Rows[i].ItemManHoursAct; 
            tempstring += "</td><td></td>" 
           } 
           tempstring += "</tr>"; 

           var newRow = $(tempstring); 

           if (id == 0) { 
            $("table#Main > tbody").html(newRow); 
           } 
           else { 
            thisRow.after(newRow); 
            thisRow.addClass("ChildrenLoaded"); 
           } 
          } 
         }, 
         error: function (xhr, textStatus, ex) { 
          var response = xhr.responseText; 
          if (response.length > 11 && response.substr(0, 11) === '{"Message":' && 
        response.charAt(response.length - 1) === '}') { 
           var exInfo = JSON.parse(xhr.responseText); 
           var text = "Message: " + exInfo.Message + "\r\n" + 
           "Exception: " + exInfo.ExceptionType; // + exInfo.StackTrace; 
           alert(text); 
          } else { 
           alert("error"); 
          } 
         } 
        }); 
       } 

alt text

는 그래서,을 console.log (계층) 정말로 이상한 것은 NaN의 표시 나 주석 경우 포함 루프 tempstring + = 그 "+"; console.log는 예상대로 작동합니다. 내가 볼 수있는 유일한 관계는 for 루프가 p < 계층을 사용하지만 이전에 계층 변수 선언에 영향을 미치지 않아야한다는 것입니다.

오, 나는 tempstring + = ""+ tier; 너무 깨졌습니다 ^^

고마워요!

답변

2

많은 코드가 있지만 HTML 덤프는 없지만 추측 할 수 있습니다.

첫 번째 시도에서 잘 실행되는 것처럼 보이지만 :

var currenttier = parseInt(thisRow.find("td.Tier").text()); 

킬 당신이 나중에 당신은 계층 당 하나의 + 추가 이후 : 당신은 흑자를 제거해야

console.log(parseInt('++ 1')); // NaN 

을, 그렇지 않으면 귀하의 전화 번호는 구문 분석되지 않습니다.

var currenttier = parseInt(thisRow.find("td.Tier").text()); 
var tier = currenttier + 1; 

여기에서 일어나고있는 것은 당신이 처음 "0"을 구문 분석하고 있다는 것입니다, 그것은 "0"때문에 잘 작동 :

+0

Ah! 고마워, 그 트릭을해야 고정! – Robodude

2

귀하의 문제는 루프에서 실제로 아니지만,이 코드에 int입니다.

하지만 두 번째로 유효한 정수는 아니지만 NaN을 제공하는 "+1"을 구문 분석합니다. 첫 번째 줄을 다음과 같이 변경하면 문제를 해결할 수 있습니다.

var currenttier = parseInt(thisRow.find("td.Tier").text().replace(/\D/g, '')); 
+0

고마워, 크래스트! 정말 감사. – Robodude

관련 문제