Tôi có bảng sauRefresh KnockoutJS dữ liệu Trong DataTables
<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>
Dưới đây là một đoạn viewmodel:
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));
};
};
}
và đối tượng Publication binded đến bảng:
function Publication(id, name, issueNumber) {
var self = this;
self.Id = id;
self.Name = name;
self.IssueNumber = issueNumber;
self.LoadedFromDatabase = false;
}
Khi dữ liệu được nạp lần đầu tiên vào bảng và khởi tạo dữ liệu, ví dụ:
$(".datatable").dataTable({ // blahh });
Tất cả mọi thứ hoạt động tốt - các dữ liệu được nạp trong bảng, sắp xếp và lọc được làm việc vv
Bây giờ khi tôi thêm một mục mới vào mảng Ấn trong những điều viewmodel chỉ sụp đổ. Ví dụ, nói rằng tôi ban đầu có 1 mục trong mảng Publications, khi tôi thêm một mục khác, nó sẽ xuất hiện trong bảng cho đến khi tôi nhấp vào một tiêu đề cột để sắp xếp.
Dường như dữ liệu có danh sách dữ liệu nội bộ riêng của nó ở đâu đó không bao gồm Ấn phẩm mới mà tôi đã tạo.
Ai đó có thể hướng dẫn tôi cách xây dựng lại dữ liệu có thể định, có tính đến dữ liệu đó là từ chế độ xem KnockoutJS không?
Xin lưu ý rằng tôi đã xem xét Plugin ràng buộc này:
http://www.joshbuckley.co.uk/2011/07/knockout-js-datatable-bindings/
Vấn đề là khi tôi sử dụng này, tôi nhận được thông báo lỗi như:
tham số chưa biết yêu cầu ' 0 'từ nguồn dữ liệu cho hàng 0.
EDIT:
Tôi đang xem xét mã và tôi nghĩ rằng tôi thấy sự cố. Trong jQuery.DataTables.js có chức năng này function _fnGetCellData(oSettings, iRow, iCol, sSpecific)
trong chức năng đó có dòng này:
if ((sData=oCol.fnGetData(oData)) === undefined)
nó sẽ gọi:
function _fnGetObjectDataFn(mSource)
Bây giờ, trong function _fnGetObjectDataFn(mSource)
có mã này được gọi là:
else
{
/* Array or flat object mapping */
return function (data) {
return data[mSource];
};
}
data
không phải là một mảng, nó là một đối tượng JSON có nghĩa là mã trên sẽ thất bại (return data[mSource];
).
Tôi thực sự không chắc chắn phải làm gì ở đây.
EDIT - QUAN TRỌNG:
Là một trong những nhà bình luận đã nhận thấy, và tôi vừa khẳng định, việc tiếp cận
http://www.joshbuckley.co.uk/2011/07/knockout-js-datatable-bindings
sẽ gây ra một cảnh báo Trojan. Vì vậy, xin lưu ý rằng url này giờ là một NO-NO lớn.
Cùng một vấn đề ở đây. Bạn đã tìm thấy giải pháp chưa? –
@Petter - Tôi đã tìm được cách giải quyết vấn đề, nhưng nó liên quan đến việc xây dựng lại dữ liệu từ đầu. Về cơ bản, bảng HTML được lưu trữ trong một khung nhìn từng phần mà tôi tải lại mỗi khi tôi cần làm mới dữ liệu. Sau mỗi lần tải lại, tôi gọi plugin ".dataTable()" trên bảng đó. Vâng, đó là một chút dài dòng để cập nhật nội dung, nhưng nó thực sự nhanh chóng ở cấp độ giao diện người dùng. Không có sự chậm lại thực sự. –
FWIW - Tôi nhận được cảnh báo từ Kaspersky khi tôi cố truy cập liên kết joshbuckley. "đối tượng HTTP độc hại ... đã phát hiện: Chương trình Trojan: 'HEUR: Trojan.Script.Iframer' (sửa đổi)". – mg1075