函数被调用太多次并保留旧的变量值

时间:2013-08-13 18:04:55

标签: javascript jquery backbone.js parse-platform

我目前有一个表,每次用户按下按钮(使用Backbone事件处理)时都会更新。

以下是每次按下按钮时触发的事件:

add: function(ev) {
            if($(ev.target).data("card-id")) {
                this.card_array.push($(ev.target).data("card-id"));
                current_deck.push($(ev.target).data("card-id"));
                updateCurrentDeckTable();
            } else {
                alert("Couldn't add the card. Please wait a few seconds before trying again.");
            }
            console.log(this.card_array);
            console.log(current_deck);
        }

updateCurrentDeckTable定义如下:

function updateCurrentDeckTable() {
        console.log(current_deck);
        var content = "";
        $.each(current_deck, function(i, cardId) {
            console.log("Index: "+i+" || Card ID: "+cardId);
            var M_Card = Parse.Object.extend("Card");
            var M_CardQuery = new Parse.Query(M_Card);
            M_CardQuery.get(cardId, {
               success: function(m_card) {
                   console.log("Got "+m_card.get("cardTitle"));
                   content += "<tr>";
                   content += "<td>"+m_card.get("objectiveNumber")+"</td>";
                   content += "<td>"+m_card.get("cardTitle")+"</td>";
                   if (m_card.get("cardAffiliation") == null) {
                       content += "<td>-</td>";
                   } else {
                       content += "<td>"+m_card.get("cardAffiliation")+"</td>";
                   }
                   content += "<td><a>Details</a></td>";
                   content += "</tr>";
                   console.log("Content: "+content);
                   $('#deck-table tbody').append(content);
               },

               error: function() {
                   alert("Error.");
               }
            });
        });
    }

现在,用户第一次按下按钮,一切正常。但是,在第二次按下时,表格中添加了多行。此外,content变量似乎保持旧值。每次调用函数时,它不应该重置为""吗?

有谁知道发生了什么?如果您需要更多信息,请询问。

1 个答案:

答案 0 :(得分:1)

为什么要使用全局current_deck变量传递数据?

每次您输入updateCurrentDeckTable方法的add分支时:

if($(ev.target).data("card-id")) {
    this.card_array.push($(ev.target).data("card-id"));
    current_deck.push($(ev.target).data("card-id"));
    updateCurrentDeckTable();
}

您要向全局current_deck添加另一个条目,然后updateCurrentDeckTable遍历该数组:

$.each(current_deck, function(i, cardId) { ...

我没有看到任何清除current_deck的东西,所以它会继续增长。这可以解释你所描述的奇怪行为。

解决方案是停止使用current_deck的全局,只需将其作为参数传递并根据需要进行清理。