Javascript MVVM 设计模式 - 如何跟踪脏状态以及谁应该执行 Ajax?

标签 javascript ajax design-patterns mvvm knockout.js

我正在完成一个相当复杂的 Knockout.js 应用程序,使用映射插件来处理紧密反射(reflect)服务器端域对象的深层对象图。我一直在完善我的模式,因为我尝试了一些对我自己有点尴尬的环境非常有效的方法,但我想知道这对于处理 MVVM Javascript 来说是一个好还是坏的整体方法。

本质上,我的页面模式是有一个显示模块功能,它的作用有点像 Controller - 它拥有 View 模型的层次结构,并负责检测更改、Ajax 对服务器的更改并使用映射插件更新其 View 具有任何后续更改的模型图,这些更改可能会以 JSON 形式返回到响应中。我这样做是因为我的域是这样的,当在服务器上验证时,图的一个部分的微小变化可能会导致图的远处部分的更改/删除。发生这种情况时,我需要一个公共(public)点来重新映射更改、向用户呈现消息对话框等。

我的所有 View 模型都是可实例化的函数,并且我对其进行了设计,以便它们对所使用的页面或服务器一无所知(即它们不执行自己的 Ajax)。每个 View 模型的构造函数通过映射选项创建其子级,并且每个级别都会传递对其父级的引用。我已经实现了大多数 View 模型使用的通用脏标志,当发生更改时,它们将对自身的引用沿链传递到顶部可观察到的“脏 View 模型”,模块订阅了该模型。我知道这听起来有点奇怪,但这似乎是解决它的最佳方法,因为每个级别的项目都会不断添加和删除,因此我无法在初始化时静态订阅属性。而且我不想每次重新映射图表时都不断删除和重新添加订阅(图表可能会变得很大)。

从纯粹的效率 Angular 来看,这并不是最好的。最简单的方法是每个 View 模型在需要时直接调用模块中的函数,但这种类型的耦合一定是错误的。或者我可以将对模块(或其相关函数)的引用传递给每个 View 模型构造函数,然后 View 模型调用它,有点像 Javascript 依赖注入(inject)。但这似乎太抽象了。这已经足够复杂了。

我是否应该考虑采用更高级别的框架(例如 Backbone)来构建这一切?注入(inject)模块引用真的太抽象了吗?或者这种构建事物的方式基本上有意义吗?我很想听听任何曾经处理过类似挑战性场景的人的来信,了解您是如何进步和完善自己的模式的。

编辑:我应该澄清一下,由于各种原因,这个应用程序在“即用即存”模式下工作,其中给定级别的更改会导致该 View 模型(不包括其 subview )立即离散 Ajax 发布)发送到服务器(可能会返回一个表示对其他任何内容进行更改的结果)。尽管需要不断的 Ajax 而不是纯粹的客户端操作,Knockout.js 仍然使我的应用程序比 Olde 的 MVC 应用程序更加优雅、可维护和可扩展。

最佳答案

可以使用发布/订阅模型来解耦 View 模型并减少引用,例如 Ryan Niemeyer discusses here .

Ryan 还为 View 模型制作了一个脏标志,可以是 found here .

关于Javascript MVVM 设计模式 - 如何跟踪脏状态以及谁应该执行 Ajax?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11965300/

相关文章:

javascript - 接下来点击图片库设置

javascript - 是否有可能从 D 2.0 编译为 Javascript?

c++ - 当我将 int 数据成员的初始化值更改为 1 以外的任何值时程序崩溃

oop - 无法提取通用接口(interface)

javascript - 避免 FF JS 自动 HTML 编码?

javascript - 纯JS水平 slider

javascript - 如何以编程方式滚动位于 flex box div 内的 D3 SVG 树?

javascript - 如何使用 JQuery AJAX 创建基于 HTTP 状态代码的自定义消息?

php - 对于我的网站功能来说,Ajax 或非 Ajax 哪一个更快?

c++ - C++程序员应该知道的著名设计模式