通过 json 的 knockoutjs 数据表不刷新

knockoutjs datatable via json not refreshing

我是 jQuery、Bootstrap 和 KnockoutJS 的新手,所以我正在寻求一些帮助。

我遵循了这个例子:http://abrudtkuhl.github.io/Simple-Knockout-Js-Paging-Datatables/ 它运行良好,但我无法刷新数据。

我的实现有一些条件字段和一个搜索按钮,所以唯一不同的是数据调用是由 onclick 事件触发的:

<script>
$(document).ready(function () {

    $("#search").click(function () {
        $.getJSON("invoiceStudents.cshtml?yr=" + $("#year").val() + "&dt=" + $("#diet").val(), function (data) {

            ko.applyBindings(new ViewModel(data));
            $("#results").DataTable({ responsive: true });
        });
    });

    function ViewModel(data) {
        var self = this;

        ko.mapping.fromJS(data, {}, self);
    };
});

当我更改我的条件并单击搜索时,我可以看到从服务器返回了不同的 JSON 数据,但是 table 具有我进行的第一次搜索的数据,没有刷新发生.

有没有人想过如何解决这个问题?

你不需要每次获取数据时都applyBindings,事实上你不应该。

调用 applyBindings 一次(在页面加载时),然后只需更新您的数据,绑定就会看到您的 UI 更新。

每次单击搜索时,您都会实例化一个新的 ViewModel 并将其应用于您的视图。尝试将其实例化一次,然后在单击时更新它。

理想情况下,您不会在此处设置点击处理程序。你应该改为放置 data-bind="click: mySearchMethod" 并在你的 ViewModel 上定义一个方法来处理这个,你的 ViewModel 会相应地更新。

同样,您不应在搜索方法中引用例如 #year,它应使用 ViewModel 的可观察属性。

这里的目标是让您的 ViewModel 尽可能少地了解您的视图,这样您就可以在不影响逻辑的情况下自由更改视图。

以下是我的做法:

$( function() {
    var viewModel = new ViewModel,
        view = $( '#results' );
    ko.applyBindings( new ViewModel, view.get( 0 ) );
    view.DataTable( { responsive: true } );
} );

function ViewModel() {
    var now = new Date;
    this.year = ko.observable( now.getFullYear() );
    this.dt = ko.observable();
    this.foo = ko.observable();
    this.bar = ko.observable();
}

ViewModel.prototype.search = function() {
     var viewModel = this;
     $.getJSON("invoiceStudents.cshtml?yr=" + this.year() + "&dt=" + this.dt(), function (data) {
          viewModel.foo( data.foo );
          viewModel.bar( data.bar );
     } );
};

感谢您的帮助。在阅读了您的答案并进行了一些深入研究后,我解决了问题:

    var studentData = [];
    var historyData = [];
    var viewModel = {
        students: ko.observableArray(studentData),
        history: ko.observableArray(historyData)
    };
    ko.applyBindings(viewModel);

我不是在寻找过于优雅的东西,只是现在有用的东西。我做了一个简单的视图模型(我没有意识到你每页只有一个加一个ko.applyBindings)。 data.result 是因为我的 JSON 包裹在结果标签中。

  $("#search").click(function () {
        $.getJSON("json/invEducationStudentSearch.cshtml?yr=" + $("#year").val() + "&dt=" + $("#diet").val(), function (data) {
            viewModel.students(data.result);
        });
    });

我的 html 很简单:

      <tbody data-bind="foreach: students">
          <tr>
              <td><span data-bind="text: id"></span></td>
              <td><span data-bind="text: fn"></span></td>
              <td><span data-bind="text: ln"></span></td>
              <td><span data-bind="text: loc"></span></td>
              <td><span data-bind="text: coy"></span></td>
          </tr>
      </tbody>