2012-08-15 14 views
2

我通过一个非常复杂的Knockout.js应用程序的一部分使用映射插件来处理与服务器端对象密切相关的深层对象图。我一直在改进我的模式,因为我对自己的稍微尴尬的上下文非常适用,但我想知道它是否是处理MVVM Javascript的好/坏的总体方法。Javascript MVVM设计模式 - 如何跟踪脏状态以及谁应该做Ajaxing?

本质上我的页面模式是有一个揭示模块功能,它有点像一个控制器 - 它拥有视图模型的层次结构,并负责检测更改,Ajaxing更改到服务器和使用映射插件来更新其查看任何可能会以JSON形式返回的流程更改的模型图。我这样做是因为我的域是这样的,即在服务器上进行验证时,图中某个部分的小改动可能会导致图中较远部分的更改/删除。当发生这种情况,我需要在此重新映射的变化,目前消息对话框给用户一个公共点等

我所有的视图模型都是实例化的功能,我设计它,以便他们一无所知他们使用的页面或服务器(即他们不做自己的Ajaxing)。每个视图模型的构造函数通过映射选项创建它的子项,每个级别都传递一个对其父项的引用。我已经实现了大多数视图模型使用的通用脏标志,当发生更改时,它们将自己的引用传递给模块订阅的顶部可观察的“脏视图模型”。我知道这听起来有点奇怪,但它似乎是最好的方式来处理它,因为每个级别的项目不断被添加和删除,所以我不能在初始化时静态订阅属性。我不希望每次重新映射我的图(可能会变得很大)时都会删除并重新添加订阅。

从纯效率的角度来看,这不是最好的。最简单的方法是每个视图模型在需要时直接调用模块中的函数,但是这种耦合类型必须是错误的。或者我可以将对模块(或其相关函数)的引用传递给每个视图模型构造函数,并且视图模型会调用它,有点像JavaScript依赖注入。但这似乎太抽象了。这很复杂。

我是否应该考虑一个更高级别的框架,比如Backbone来坐在这些之上?注入模块引用真的太抽象了吗?或者,这种构造东西的方式基本上是有道理的吗?我很想听到任何人从事同样具有挑战性的场景,以及您如何进步和完善您的模式。

编辑:我应该澄清,由于各种原因,这个应用程序在“保存为你去”模式,即一个给定的水平的变化导致即时离散的Ajax职位只有一个视图模型(不包括其孩子)被发送到服务器(这可能会返回一个结果,代表任何其他变化)。尽管与纯粹的客户端动作相比,不断需要Ajaxing,Knockout.js仍然使我的应用程序更加优雅,可维护,并且比我的Olde的MVC应用程序更具可扩展性。

+0

您是否考虑过使用pub/sub而不是父母引用? http://www.knockmeout.net/2012/05/using-ko-native-pubsub.html – Tyrsius 2012-08-15 16:09:47

+0

这看起来很酷,我刚刚下载了Niemaster的ko.postbox项目,并正在试验,看看它是否可以符合我的目的。我怀疑我仍然需要我的通用DirtyFlag对象来实现它的视图模型状态比较逻辑,但是pub/sub可能会简化与模块的通信。干杯,我会保持你的发布。 – 2012-08-15 21:53:40

+0

尼迈耶你有覆盖那里:http://www.knockmeout.net/2011/05/creating-smart-dirty-flag-in-knockoutjs.html – Tyrsius 2012-08-15 23:19:13

回答

2

解耦您的viewmodels和减少引用可以实现与pub/sub模型,如一个瑞安尼迈耶discusses here

瑞安还为视图模型制作了一个脏标志,它可以是found here