何时在 Knockout.js 中创建新视图模型

When to create new view models in Knockout.js

我发现在 knockout.js

中谈论多视图模型时通常会有些混淆

ko 文档并没有真正解释如何处理多个视图模型、如何在它们之间进行通信或何时应考虑它们。

我发现 this site 解释了创建多个视图模型的不同方法以及如何与它们交互。

我试了一下,创建了一个包含不同子模型的主模型:

var MasterModel = function(){
    this.orders = new ordersViewModel(),
    this.dates = new datesViewModel(),
    this.equipment = new equipmentViewModel();
};

在那之后,我发现自己不得不在很多地方使用 with: nameOfModel(并为其创建额外的包装器或 HTML 注释),甚至只是使用视图模型的名称作为前缀 data-bind="foreach: orders.getList()".

除此之外,还有它们之间的通信问题,虽然可以通过某种方式解决,但似乎不像处理单个视图模型时那么简单。

我的问题是,是否值得创建多个视图模型?如果是,什么时候?似乎这只会增加更多的困难,而我最终并没有看到它的优势。 (是的,他们说它保持模块化......但我最终没有看到明显的优势)

对于应该使用多少个视图模型或者是否应该使用一个捕获所有视图模型没有硬性规定。

这完全取决于您正在构建的应用程序的复杂性,以及您是否要封装和模块化功能位以供重用或只是理智。

如果您发现自己构建了一个复杂的应用程序,那么您可能会发现将应用程序模块化为单独的视图模型更易于管理和进一步更改。

After that, I found myself having to use with: nameOfModel in many places (and create extra wrappers or HTML comments for it) or even just using the view model's name as a prefix data-bind="foreach: orders.getList()".

我使用一个名为 DurandalJS 的框架来促进模块化和组合。它还提供了一些很棒的功能,例如路由和消息传递。 DurandalJS 的组合可以帮助您减少 with: 绑定的数量,因为它使用 ko.applyBindings 将视图模型和视图绑定到页面。

我同意 Anish Patel 的观点,这取决于关注点的分离,并让你的 class 遵循单一职责原则(每个 class 只做一件事,我'我们发现很难处理视图模型)。您可能还需要考虑让您的视图模型可以使用 Jasmine 或其他 JS 测试框架进行测试。

在 HTML 中使用 with: 在我看来是个不错的方法。

RequireJs 可以帮助使事物模块化并使依赖关系正常工作。

ko.postbox 允许您在视图模型之间进行 publish/subscribe 通信,而不必将它们耦合在一起。这是在您提到的 link 中。 您还可以通过在视图模型中传递回调函数来进行通信。

Durandal 是个好建议。我也对 Durandal 的创建者 Rob Eisenberg 的 Aurelia 感兴趣,但截至 2015 年 7 月 2 日它仍处于测试阶段。这将使用标准化的 SystemJs 加载模块,并且应该使模块化视图模型更容易做到。