Я получаю записи динамически из базы данных с помощью вызова 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.");
}
}
});
Я не хочу добавлять 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()
показанным выше), и вам никогда не нужно проходить через фактическую таблицу.