1

すべてのページで実行される可能性のある共通のビュー モデルと、ページの読み込み時に追加されるページ固有のモデルを含む、ある種のマスター ビュー モデルを作成して初期化しようとしています。

var MasterViewModel = {
   commonViewModel1 : CommonViewModel1(),
   commonViewModel2 : CommonViewModel1()
};

var commonInit = function() {
  // Populate View Model Data
  MasterViewModel.commonViewModel1 = initCommonViewModel1();
  MasterViewModel.commonViewModel2 = initCommonViewModel2();

  // Apply common view model bindings
  ko.applyBindings(MasterViewModel);
};

var pageSpecificInit = function() {
  // Populate Specific View Model Data
  MasterViewModel.pageViewModel1 = initPageViewModel1();
  MasterViewModel.pageViewModel2 = initPageViewModel2();

 // Apply Page Specific Bindings
 ko.applyBindings(MasterViewModel);
};

$(function() {
  commonInit();
  pageSpecificInit();
});

これは、実際のアプリケーションで私がやろうとしていることの大まかな例です。これはすべて名前空間化され、ページ固有のコードのみが実行されるように個別のファイルに格納されています。これを行うためのベストプラクティスは何ですかhttp://www.knockmeout.net/2012/05/quick-tip-skip-binding.htmlに基づいていますが、アプリケーションでそれを行うと、「 pageViewModel1 undefined にバインドできません"

var MasterViewModel = {
   commonViewModel1 : CommonViewModel1(),
   commonViewModel2 : CommonViewModel1(),
   pageViewModels : {}
};

    var commonInit = function() {
  // Populate View Model Data
  MasterViewModel.commonViewModel1 = initCommonViewModel1();
  MasterViewModel.commonViewModel2 = initCommonViewModel2();

  // Apply common view model bindings
  ko.applyBindings(MasterViewModel);
};

var pageSpecificInit = function() {
  // Populate Specific View Model Data
  MasterViewModel.pageViewModels.pageViewModel1 = initPageViewModel1();
  MasterViewModel.pageViewModels.pageViewModel2 = initPageViewModel2();

 // Apply Page Specific Bindings
 ko.applyBindings(MasterViewModel.pageViewModels);
};

$(function() {
  commonInit();
  pageSpecificInit();
});
4

1 に答える 1

1

2 番目の例の方が正しいですが、ページ固有のビュー モデルを、バインド停止コメントで囲んだ特定の html 要素にバインドするべきではありませんか?

ko.applyBindings(MasterViewModel.pageViewModels, $('#pageElement')[0]);

ただし、互いに通信できる適切に分離されたオブジェクトが必要な場合は、 Knockout Postboxを確認することをお勧めします。

于 2013-01-31T16:01:38.063 に答える