在DataTables中刷新KnockoutJS数据

Jas*_*ans 10 binding datatables knockout.js

我有下表

<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>
Run Code Online (Sandbox Code Playgroud)

以下是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));
    };
};
Run Code Online (Sandbox Code Playgroud)

}

和绑定到表的Publication对象:

function Publication(id, name, issueNumber) {
    var self = this;

    self.Id = id;
    self.Name = name;
    self.IssueNumber = issueNumber;
    self.LoadedFromDatabase = false;
}
Run Code Online (Sandbox Code Playgroud)

当数据首次加载到表中时,数据表初始化例如

$(".datatable").dataTable({ // blahh });
Run Code Online (Sandbox Code Playgroud)

一切正常 - 数据加载到表中,排序和过滤工作正常等.

现在,当我在viewmodel中向Publications数组中添加一个新项时,事情就会崩溃.例如,假设我最初在Publications数组中有1个项目,当我添加另一个项目时,它将出现在表格中,直到我点击列标题进行排序.

似乎数据表在某处有自己的内部数据列表,不包括我创建的新出版物.

有人可以指导我如何重建数据表,考虑到数据来自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 )
Run Code Online (Sandbox Code Playgroud)

反过来调用:

function _fnGetObjectDataFn( mSource )
Run Code Online (Sandbox Code Playgroud)

现在,function _fnGetObjectDataFn( mSource )有这个代码被称为:

else
{
    /* Array or flat object mapping */
    return function (data) {
         return data[mSource];
    };
} 
Run Code Online (Sandbox Code Playgroud)

data它不是一个数组,它是一个JSON对象,这意味着上面的代码将失败(return data[mSource];).

我真的不知道该怎么做.

编辑 - 重要:

正如其中一位评论员所注意到的,我刚刚确认,访问

http://www.joshbuckley.co.uk/2011/07/knockout-js-datatable-bindings

将导致特洛伊木马警告.所以请注意,这个网址现在是一个很大的NO-NO.

Luf*_*ffy 1

您提到您使用了数据表插件并收到“从第 0 行的数据源请求未知参数‘0’”错误。

在我之前使用不带淘汰插件的数据表的经验中,我仅使用比标题定义更多的列时出现此错误,反之亦然。您必须检查您的身体和头部部分,并确保它们的尺寸相同。

或者您可能在初始化表时使用“aoColumnDefs”选项。再次检查选项定义并确保您没有尝试到达未知列:

例如,如果您有这样的定义

"aoColumnDefs": [{
         "bSearchable": false,
         "bVisible": false,
         "aTargets": [0]
     }, {
         "bSortable": false,
         "bSearchable": false,
         "sWidth": "45px",
         "aTargets": [2]
     }]
Run Code Online (Sandbox Code Playgroud)

如果你只有 2 个 head 部分,这会给你这个错误。因为您正在使用 aTargets 到达第三列:[2]