Не хотите добавлять дубликаты строк в таблицу с помощью jquery

0

Я получаю записи динамически из базы данных с помощью вызова Ajax. Но я хочу ограничить добавление только новых строк. Например, если для первого вызова ajax у меня есть строки.

<tr><td>123</td><td>581</td><td>2013-05-05</td></tr> <br/>
<tr><td>198</td>td>55</td><td>2013-05-05</td></tr>

Для второго вызова ajax я получаю строки следующим образом.

<tr><td>123</td><td>581</td><td>2013-05-05</td></tr> <br/>
<tr><td>4465</td><td>3481</td>td>2013-06-05</td></tr>

Теперь я хотел бы проверить таблицу с 1-м значением td. Если новые строки уже имеют строки в таблице, я не хочу их добавлять. Должны быть добавлены только разные строки. В приведенном выше примере я не хочу добавлять значение td со значением 123, потому что оно уже существует. Я смущен, как это сделать.

$.ajax({ // Making an Ajax call.
            url:"/Project/getAllMessages.do", // Call URL.
            dataType:"json", // Expecting the data type as Json.                
            data:{ // Pass commodityId,apmcId,mainLabelId & UserDB to the ervice.

                mainLabelId:mainLabelId,
                inputDate:inputDate
            },
            "async":false,
            type:"POST",            
            success:function(allMessagesJson){ // Get Json data in Success Call back function.

                $('#divAllInbox').css('display','none');
                var allMessages = allMessagesJson[0];
                for(index in allMessages){

                    counter ++;
                    arrMsgs[counter] = allMessages[index]; // Take the complete message into Array.     
                    mysqlContentId = allMessages[index].mysqlContentId; //mysqlContentId.                



                    var imgMainLabel = mainLabelName.replace(/\s/g, ""); // Remove spaces from the string.



                    $("#tblMainLabelsInbox tbody").loadTemplate($("#messageTemplate"), // Load All tr as Template. 
                            {
                                comm_main_labelid:allMessages[index].mainLabelId,
                                comm_mysql_id:mysqlContentId,
                                comm_hidden_date:allMessages[index].date
                            },
                            {
                                append:true
                            }
                    ); // Appended to Table.                        

                } // End For.   



            },
            error:function(xhRequest, ErrorText, thrownError){ // Error Call back function.
                if(xhRequest.status === 401 || xhRequest.status === 403){
                    alert("Bad Request. Please Try Again.");
                } else if ( xhRequest.status === 504 && !ajaxRequest++ ) {
                    loadData(commodity,apmc,mainLabelId,userDB);
                } else if ( xhRequest.status === 500) {
                    alert("Server error. Please try later.");
                }
            }
        });
  • 0
    Ваш HTML для ваших строк недействителен. Вы должны начать с исправления этого. Что касается получения только новых строк, вы бы хотели как-то разбить ваши результаты на бэкэнд и возвращать только те данные, которые вам нужны. было бы лучше поместить эту логику в бэкэнд. поиск по этому сайту по ключевым словам ajax и paginate должен дать вам некоторые идеи для этого.
  • 0
    @jammypeach, HTML-код редактируется. Мне нужно проверить только на стороне Ajax. Мое требование такое вот.
Показать ещё 7 комментариев
Теги:

1 ответ

2
Лучший ответ

Я не хочу добавлять td с значением 123

Если вы говорите, что первого столбца достаточно, чтобы идентифицировать строки, а затем, возможно, в качестве первой строки вашего обработчика success вы можете получить эти значения из таблицы и поместить их в массив:

var rowIds = $("#tblMainLabelsInbox tbody tr td:first-child").map(function() {
                 return $(this).text();
             }).get();

... и затем в вашем цикле for когда вам нужно посмотреть, находится ли строка, только что полученная через Ajax, уже в таблице, просто проверьте, есть ли она в массиве:

if ($.inArray(mysqlContentId, rowIds) === -1) {
    $("#tblMainLabelsInbox tbody").loadTemplate($("#messageTemplate"), 
                        {
                            comm_main_labelid:allMessages[index].mainLabelId,
                            comm_mysql_id:mysqlContentId,
                            comm_hidden_date:allMessages[index].date
                        },
                        {
                            append:true
                        }
     ); // Appended to Table.
     rowIds.push(mysqlContentId);
}

Я предполагаю в моем коде выше, что ваша переменная mysqlContentId является той, у которой есть идентификатор ключа записи. Если это фактически allMessages[index].mainLabelId то, очевидно, вы сделаете соответствующую замену.

Я предлагаю массив, потому что должно быть достаточно эффективным для проверки значения в массиве на каждой итерации цикла for, чем для проверки значения в DOM. Говоря об эффективном, а не заполнении массива, перебирая таблицу (с помощью .map()) для каждого вызова Ajax, возможно, если вы просто инициализируете пустой массив при первой загрузке страницы:

var rowIds = [];

... тогда вы можете просто добавить идентификаторы во время обработки Ajax (как и с .push() показанным выше), и вам никогда не нужно проходить через фактическую таблицу.

  • 0
    Спасибо. Я уже сделал это другим способом ..
  • 1
    @ Nizam, пожалуйста, примите этот ответ, если он решит вашу проблему, в противном случае, пожалуйста, опубликуйте свое собственное решение и примите это как ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню