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();
});

这是我在实际应用程序中尝试做的一个粗略示例,这都是命名空间和单独的文件,因此只运行特定于页面的代码。执行此操作的最佳做​​法是什么?无法绑定到未定义的 pageViewModel1”我应该以不同的方式设置我的 MasterViewModel 以更像

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

您的第二个示例更正确,但是您不应该将特定于页面的视图模型绑定到您用停止绑定注释包围的特定 html 元素吗?

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

但是,如果您想拥有可以相互通信的良好解耦对象,那么您可能需要查看Knockout Postbox

于 2013-01-31T16:01:38.063 回答