2

ここで何が問題なのかはわかりませんが、KnockoutJS は my 内にある監視可能な配列を見つける際にいくつかの問題を抱えていMasterViewModelます。私の最初の KJS アプリではなく、2.2.1jQueryでの使用。1.8.xここにあります:

初期化する

$(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です。大文字と小文字の区別 また、ウィンドウ上のビューモデルはすでに作成/初期化されています。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 に答える