Pager.js:如何延迟加载绑定

时间:2014-07-31 18:09:10

标签: javascript jquery html knockout.js

我试图弄清楚如何将Pager.js与Knockout.js一起使用来延迟加载页面并绑定其内容。我正在尝试翻译demo example,但我不熟悉require.js,我只是迷路了。

我花了几个小时尝试使用jQuery的getJSON代替requiredefine来重新实现系统,但绑定却默默地失败了。我有两个问题:

  1. 视图模型是一个JSON数组,因此我不知道该数组的名称是什么
  2. 代码实际上并没有执行getJSON请求(日志中没有任何内容)。并且默默地失败了。
  3. 以下是代码:

    <div data-bind="page: {id: 'history', title: 'History', withOnShow: $root.getHistory }">
    
    var ViewModel = function (data) {
      var self = this;
      ko.mapping.fromJS(data, {}, self);
    
      self.getHistory = function () {
        return function (f) {
          $.getJSON("@{HistoryR}", function (data) {
            viewModel.history = ko.mapping.fromJS(data, {});
            f(viewModel.history);
          });
        }
      }          
    };
    
    $.getJSON("@{HomeR}", function (data) {
      viewModel = new ViewModel(data);
      pager.extendWithPage(viewModel);
      ko.applyBindings(viewModel);
      pager.start();
    });
    

    我重新编写了一些代码,以适应huocp的回答:

      self.getExamHistory = function (f) {
        $.getJSON("@{ExamHistoryR}", function (data) {
          self.history = ko.mapping.fromJSON(data, {});
          f(self.history);
        });
      }
    

    并且getJSON调用被触发(我在控制台中看到响应),但我的viewModel.history仍为空。

1 个答案:

答案 0 :(得分:1)

你对withOnShow回调函数进行了错误的换行。

取下包裹,你应该没问题: - )

self.getHistory = function (f) {
  $.getJSON("@{HistoryR}", function (data) {
    self.history = ko.mapping.fromJS(data); // can u try self instead of viewModel
    f(self.history);
  });
};

带有额外换行的Pager.js演示页面的原因是它使用withOnShow: requireVM('invention'),而不是withOnShow: requireVM。它使用requireVM函数的返回值,而不是函数本身。