У меня есть следующая таблица
<table class="datatable zebra-striped">
<thead>
<tr>
<th>Name</th>
<th>Issue</th>
<th></th>
</tr>
</thead>
<tbody data-bind="foreach: Publications">
<tr>
<td><span data-bind="text: Name" /></td>
<td><span data-bind="text: IssueNumber" /></td>
<td><button type="button" class="btn" data-bind="click: $parent.DeletePublication">Delete</button></td>
</tr>
</tbody>
</table>
Вот фрагмент модели представления:
function EditReaderViewModel() {
var self = this;
self.Publications = ko.observableArray([]);
self.OnAddPublicationSaveButtonClicked = function () {
//.. code omitted.
self.Publications.push(new Publication(publication.value, publication.label, publication.issueNumber));
};
};
}
и объект Publication, связанный с таблицей:
function Publication(id, name, issueNumber) {
var self = this;
self.Id = id;
self.Name = name;
self.IssueNumber = issueNumber;
self.LoadedFromDatabase = false;
}
Когда данные впервые загружаются в таблицу и инициализируются данными, например,
$(".datatable").dataTable({ // blahh });
Все отлично работает - данные загружаются в таблицу, работает сортировка и фильтрацияи т. д.
Теперь, когда я добавляю новый элемент в массив Publications в viewmodel, вещи просто распадаются.Например, скажем, у меня изначально есть 1 элемент в массиве Publications, когда я добавляю другой элемент, он будет отображаться в таблице до тех пор, пока я не нажму на заголовок столбца для сортировки.внутренний список данных, который не включает новую созданную мной публикацию.
Может кто-нибудь подсказать мне, как перестроить таблицу данных, учитывая, что данные взяты из модели представления KnockoutJS?
Пожалуйстаобратите внимание, что я посмотрел на этот плагин привязки:
http://www.joshbuckley.co.uk/2011/07/knockout-js-datatable-bindings/
Проблема в том, что при использовании этого я получаю сообщения об ошибках, такие как:
Запрошен неизвестный параметр '0' из источника данных для строки 0.
РЕДАКТИРОВАТЬ:
Я просматриваю код и думаю, что вижу проблему.В jQuery.DataTables.js есть эта функция function _fnGetCellData( oSettings, iRow, iCol, sSpecific )
В этой функции есть эта строка:
if ( (sData=oCol.fnGetData( oData )) === undefined )
, которая, в свою очередь, вызывает:
function _fnGetObjectDataFn( mSource )
Теперь в function _fnGetObjectDataFn( mSource )
есть этот код, который называется:
else
{
/* Array or flat object mapping */
return function (data) {
return data[mSource];
};
}
data
- это не массив, это объект JSON, что означает, что приведенный выше код завершится ошибкой (return data[mSource];
).
Я действительно не уверен, что здесь делать.
РЕДАКТИРОВАТЬ - ВАЖНО:
Как заметил один из комментаторов, и я только что подтвердил доступ к
http://www.joshbuckley.co.uk/2011/07/knockout-js-datatable-bindings
приведет к появлению троянского предупреждения.Поэтому, пожалуйста, имейте в виду, что этот URL теперь является большим НЕТ-НЕТ.