2

不知道这里出了什么问题,但是 KnockoutJS 在查找我的MasterViewModel. 2.2.1与 jQuery 一起使用,1.8.x而不是我的第一个 KJS 应用程序。这里是:

初始化

$(function() {
  window.vm = new MasterViewModel();
  ko.applyBindings(vm);
});

视图模型

function MasterViewModel(data) {
  var self = this;
  self.currentAppView = ko.observable();

  // Users
  self.userList = ko.observableArray([]);
  self.templateListGetter = ko.computed(function() {
    $.getJSON("/user/list"), function(data) {
      var mapped = $.map(data, function(item) { return new userModel(item) });
      self.userList(mapped);
    };
  });

  self.goToAppView = function(appView) { 
    location.hash = '!/' + appView;
  };    
  Sammy(function() {
      this.get('#!/:appView', function() {
        self.currentAppView(this.params.appView);
        $('.appview').hide();
        ko.applyBindings(new window[this.params.appView+'VM']());
      });
      this.notFound = function(){
        location.hash = "!/dashboard";
      }
      //this.raise_errors = true;
  }).run();
}

风景

  <table class="table table-bordered table-striped">
    <tbody data-bind="foreach: userList">
      <tr>
        <td data-bind="text: guid"></td>
        <td data-bind="text: firstName"></td>
        <td data-bind="text: lastName"></td>
        <td data-bind="text: email"></td>
        <td data-bind="text: updated"></td>
        <td data-bind="text: suspended"></td>
      </tr>
    </tbody>
  </table> 

我有一个正在加载的简单表格

即使在仔细检查了几件事(例如添加defer="defer"到我的 JS 标记并确保userList存在)之后,它也根本找不到 observableArray。它给出了错误:

Message: ReferenceError: userList is not defined;
Bindings value: foreach: userList Error {} 

有人知道发生了什么吗?

更新

对于那些想知道每次哈希更改时调用什么的人:

function usersVM() {
    // Data
    var self = this;
    // Behaviours
    $('#users').show();
}
4

1 回答 1

1

看起来您正在使用未定义的视图模型初始化淘汰赛?

ko.applyBindings(new window[this.params.appView+'VM']());,但您的实际视图模型是window.vm. 区分大小写ftw。此外,窗口上的视图模型已经创建/初始化。所以你不需要new运营商。

因此,将 applyBindings 行更改为

ko.applyBindings(window[this.params.appView+'vm']());

更新答案:通过海报

ko.applyBindings每次路由更改时都没有必要继续运行,因为它已经在页面加载时应用了绑定。所以 Sammy.js 被改为:

  Sammy(function() {
      this.get('#!/:appView', function() {
        self.currentAppView(this.params.appView);
        $('.appview').hide();
        window[this.params.appView+'Route']();
      });
      this.notFound = function(){
        location.hash = "!/dashboard";
      }
      //this.raise_errors = true;
  }).run();

它确实看起来ko.computed或常规函数调用window.vm.getUserList()没有正常运行,但这将被保存以用于不同的问题。

function usersRoute() {
    // Data
    var self = this;
    // Behaviours
    $('#users').show();
    window.vm.getUserList();
}
于 2013-02-19T00:16:38.027 回答