Контекст: у меня есть веб-работник, который «подписывается» на обновления данных из серверной части через веб-сокет, которые затем публикуются в представлении, отображаемом через DataTables.net. Для повышения эффективности добавленные данные помещаются в веб-сокет какчастичная запись (т. е. только одна строка).
Поскольку данные отделены от DataTable (т. е. он не использует Ajax API; это в основном источник JavaScript), я не могу просто добавить строку и отобразитьТаблица.В случае срабатывания двух нажатий на одну и ту же строку я получаю дублирующиеся строки.
Итак, я выбрал небольшой плагин:
$.fn.dataTable.Api.register('deDupe', function (dataSet, idColumn) {
idColumn = idColumn || 0;
var columnData = this.columns().data()[idColumn];
for(var i=0; i < dataSet.length; i++) {
var thisId = dataSet[i].id;
var matchedIndex = columnData.indexOf(thisId);
if(matchedIndex > -1) {
var matchedRow = $(this.rows().nodes()[matchedIndex]);
this.row(matchedRow).remove();
}
}
// return "this" for chaining
return this;
});
(Не смейтесь надменя за то, что я утешался старомодными циклами "for"!)
И затем при использовании я делаю это:
myTable.deDupe(dataSet).rows.add(dataSet).draw();
Метод, который получает данные и затем обновляет таблицу, уже имеетвходящая строка, которая содержится в «dataSet», а затем я передаю индекс COLUMN для столбца, который должен содержать уникальный идентификатор в целях устранения дублирования.Обратите внимание, что при выполнении кода вместо удаления входящего дубликата я удаляю предыдущую строку, а затем добавляю входящий.Бывают случаи, когда строка содержит обновленные данные, и я действительно беспокоюсь только об устранении дублирования на уровне идентификатора, а не на уровне содержимого ... всегда просто слепо использую последние данные.
Итак, несколько вопросов:
Есть ли лучший способ сделать это?Мне бы очень хотелось увидеть основной вариант, но я его не встречал.Кажется, это довольно распространенный функционал.Я сумасшедший здесь, заново изобретая колесо?(другими словами, опция инициализации?)
При условной проверке совпадения вы видите эту строку: var matchedRow = $(this.rows().nodes()[matchedIndex]);
Это кажется мне дурацким, но я не смогобдумайте другие способы определения строки, которая будет использоваться в цепочке .remove()
.По моему мнению, я уже знаю индекс строки, поэтому я думал, что что-то вроде matchedRow = this.rows(matchedIndex)
будет работать, но я не могу найти это или что-то подобное.Так что я не только копаюсь в rows().nodes()
, но затем все это оборачивается в jQuery, а затем передается в .row(matchedRow)
'.Кажется, он так сильно вложен и обернут для чего-то, что я чувствую, что уже должен иметь прямой доступ.
Не поймите меня неправильно;код «работает» и исправление его, вероятно, является микрооптимизацией.Но это кажется мне чрезвычайно запутанным и дает мне некоторый запах кода, которого я хочу избежать ради разработчиков технического обслуживания.