我需要在浏览器客户端上为基于服务器的应用程序使用MVC模型的原因是什么?

时间:2014-10-16 10:20:48

标签: javascript angularjs backbone.js model-view-controller three-tier

假设:

  • 我有一个带有Java风格的Web服务器的银行应用程序。
  • 客户端用JS编写,带有主干和其他一些插件。 (开发人员是Angular的粉丝,但他们没有使用它)。

我的JavaScript开发人员来找我并说“X是不可能的,因为我们在浏览器中使用MVC的方式。”

现在我在服务器端使用MVC很好,我们已经有了。但是当JavaScript人员希望在客户端上拥有MVC时,我们就会在两个不同的地方保持关于客户体验的状态。我认为保持在一个地方更简单。

我熟悉90年代的“三层”架构 - 包括数据库层,事务管理层和客户交互层。我们离开了,因为它太可怕了。

我也熟悉在Node.js中运行服务器端应用程序。对我来说 - 在这种情况下拥有服务器端MVC是有意义的。

我的问题是:我在浏览器客户端上为基于服务器的应用程序需要MVC模型的原因是什么?

4 个答案:

答案 0 :(得分:1)

我没有得到关于不在客户端上保持状态的评论,因为你在服务器上保留了状态。

这是当时Hotmail和Gmail之间的区别。 Gmail显然没有在AngularJs中实现,但是前后导航,撤消等......没有往返服务器就是从客户端保留一些相关状态所得到的。

在我看来,两者都有不同的用途。一个便于用户交互。另一个涉及持久/受保护状态。

答案 1 :(得分:0)

好像你正在退回到过去的好时光(不是!),每次点击都需要往返服务器才能工作。它似乎与Ajax / REST模型相矛盾。 它可能适合您的应用程序,特别是,这个模型对很多其他人来说非常有用。

至于您的问题:客户端MVC允许您使用可维护的代码构建丰富的UI应用程序。

并且jsut从wikipedia添加引用:早期的Web MVC框架采用瘦客户端方法,几乎​​将整个模型,视图和控制器逻辑放在服务器上。在这种方法中,客户端向控制器发送超链接请求或表单输入,然后从视图中接收完整和更新的网页(或其他文档);该模型完全存在于服务器上。[8]随着客户端技术的成熟,已经创建了AngularJS,Ember.js,JavaScriptMVC和Backbone等框架,允许MVC组件部分在客户端上执行(参见AJAX)。

答案 2 :(得分:0)

我打了很长时间以避免使用Javascript,因为它没有强类型。自从Jcc成为最强大的DOM语言以来,我已经退出了这一点,而且它还有成千上万的开源framweworks(只看JQuery,甚至是Typescript)。

在#34之前,每个人都需要一个浏览器"时代,服务器方面是王道。我记得哑终端的时代。从那以后,当我们现在拥有像每台桌面上的计算能力一样的大型机时,利用客户端PC电源是有意义的。如果我们真的看一下MVC,我们会看到一个只进行路由的控制器(如果它的客户端做了它真的不重要吗?),模型总是最接近数据库,但是......这些天客户端数据绑定是王道,你需要客户端可以绑定的模型。模型本身,甚至不再需要服务器端,并且使用JSON等协议,在客户端创建动态模型很简单,只需解析名称/值对并显示它。我们看到验证转移到客户端(这对用户输入有意义,但客户端也可以验证来自DB的数据,只是为了显示用户错误。这导致客户端状态机的视图。那么剩下什么了服务器要做什么?答案:开始工作,获取数据并保存数据。

当我们看到Silverlight甚至Flash开始昙花一现时,这是因为RIA的事情(服务器端)时代被客户端框架所取代。 HTML 5加速了服务器端RIA的死亡,因为现在浏览器可以基于标准进行持久的双向通信。突然之间,将大部分MVC移植到客户端都是有道理的。对于像我这样的服务器端传统主义者来说,它是陌生的(现在)......

你可以看到像Durandal,Angular,Knockout,Node等框架只是重新发明MVC和Binding,除了这次它的客户端。现在是学习这些东西的好时机,因为它相对较新。它只会增长,因为所有的基础设施都已经到位。我们所瞄准的新系统不再是一个巨大的服务器,但它是对巨大的浏览器的开发"。我们必须将Web浏览器视为新的庞大系统,因为它们代表了用户和电子商务的一切。我们对操纵和提供DOM的了解越多,我们就越好......服务器端将永远存在,但它不再是宇宙的中心。

他们预测,移动设备的普及以及对更多应用程序(客户端)的需求在未来10年内如此强劲,以至于开发人员将缺乏跟上的步伐。对我来说,这是将客户换档的原因。

答案 3 :(得分:0)

完全同意New Dev的回答。

在服务器中,您以当前记录的用户,数据等形式处理状态。

在客户端中,您的状态将是应用程序状态("页面"或他们正在进行的屏幕,这是列表中当前选定的项目,依此类推)。

将服务器(如果它使用REST API实现)视为您的数据库+身份验证,将您的客户端视为桌面应用程序(UI状态是您正在处理的)。这种思维方式最初对Backbone有帮助。将SELECT转换为collection.fetch,将INSERT / UPDATE转换为model.save()并将DELETE转换为model.destroy()。在SPA中,您的API是您的数据库,您的SQL是HTTP和JSON - 可能更多,但它可能有助于这样思考。