Angular.js和ASP.NET MVC 4

73

我有一个ASP.NET MVC 4的项目,目前在架构决策上陷入困境,不知道是使用Angular.js还是Knock.js JavaScript框架或库。 我目前倾向于使用Angular.js而不是Knockout.js,但不想在项目开发进行到一半时发现犯了错误。

以下是一些背景:

  • 我们需要双向模型数据绑定
  • 我们需要测试视图的能力。 我希望能够进行端对端单元测试。 另外,我们正在使用持续集成。
  • "保存更改"功能。 例如,如果用户在页面上进行更改,我们需要能够检测到任何更改并提示用户在离开页面之前保存更改。
  • "通知"功能。 例如,用户将登录大约8个小时,并且需要被通知和更新其他用户所做的更改(错误、数据状态更改等)
  • 我们需要“未来证明”我们的应用程序。 目前业务部门尚未决定是否需要支持移动设备,但我知道这只是时间问题。
  • 我们的团队由经验水平不同的开发人员组成,从非常初级到资深的开发人员。
  • 目前我们的模型很复杂,可能会变得更加复杂
  • 我们还需要考虑RAD、代码重用和可维护性

我已经阅读了这篇优秀的回答,并观看了Scott Allen关于Angular的采访这里

由于我们无法从当前ASP.NET MVC 4架构更改为使用像Web API这样的服务器端内容,因此在尝试使用MVC 4实现Angular.js时,我有一些顾虑。这会导致我们拥有一个在服务器上和一个在客户端上的两个模型吗?

我不希望就 Angular 和 Knockout 哪个更好进行讨论,因为我认为它们都有优缺点。我正在寻找一个在 ASP.NET MVC 4 应用程序中实现 JavaScript 框架或库的实际代码解决方案。我需要一种能够使用两年以上的解决方案 :)

有什么想法或建议吗?也许答案不是 Knock 或 Angular,而是其他 JavaScript 框架?


1
我很好奇在使用ASP.NET MVC时为什么需要这两个东西?为什么不直接使用带有Razor的ASP.NET视图,并使用ajax调用和jquery来操作DOM呢? - user441521
3个回答

57

我的个人看法。

前言 - 我曾经使用过Angular和Knockout。 我正在使用第三个非平凡的MVVM/MVC库构建前端。

我从Knockout开始,因为它的MVVM与WPF/Silverlight机制非常相似。而且它运作良好。教程和文档都非常棒。所有程序员都可以在几天内或者如果他们在.NET下使用了MVVM,则可在几小时内学会使用knockout.js。

然而,这些天我正在使用Angular,并且可能会一直使用它,因为以下原因:

  • Angular是一个完整的框架-Knockout实际上只涉及两 向绑定。你仍然需要其他库,比如backbone.js/jquery 来完成其他工作。

  • Angular具有依赖注入。非常适合添加
    用于测试的mock,同时给你的代码结构。

  • Angular将普通JS变量视为其$scope中的观察变量。 对象。这意味着你不必以特殊的方式声明它们

我不是Angular的狂热粉丝,我仍然认为他们可以更多地转向MVVM架构,而不是当前的“奇妙”的MVVM/MVC混合架构。

Angular的最大问题是文档。与Knockout相比,它非常糟糕。这将增加使你的程序员掌握所需时间和成本。但在我看来,一旦他们学会了它,目前它是最好的选择。


21

很高兴看到这个问题引起了社区的兴趣 ;) 为了完整起见,这是我最终所做的:

我选择了AngularJS和ASP.NET MVC 4,并且很高兴我这样做了。尽管Angular有一个陡峭的学习曲线,但由于指令的强大功能,这是值得的。

  • 我们需要双向模型数据绑定 - 有时我需要设置一些来自MVC控制器的初始值。 我使用ng-init属性来实现这个目的。
  • 我们需要能够测试视图 - 我遵循了AngularJS文档进行测试
  • "保存更改"功能 - 我使用Angular中的指令实现了这个功能
  • "通知"功能 - 我使用toastr.js和指令来实现了这个功能(非常棒)
  • 我们需要 "未来证明" 应用程序 - 我不知道Google对AngularJS的计划,但在使用AngularJS之后,我认为它不会很快消失,并预计它将被更广泛地采用 :)

2
这只是我的个人看法:AngularJS是开源的,所以 Google 的计划并不那么重要。现在一切取决于社区的需求 :) - DomenicDatti

12

我对AngularJs没有太多的了解,但我想提供一些有关Knockout的想法。

Knockout主要是一个数据绑定库,用于将视图连接到视图模型,但除此之外并没有提供很多能力。我不建议仅使用Knockout来构建复杂的基于客户端的网站。

您没有提到您是否正在实现类似spa的功能(即哈希标记导航),或者您是否主要使用MVC服务器端视图(例如Razor)。如果您只是在寻找每个页面级别的快速数据绑定,我甚至会重新考虑这一点。对我而言,这两个框架(Angular或Knockout)都旨在增强客户端开发体验 - 并非MVC这样的服务器端方法。

如果您正在考虑SPA方法,即使只是部分地考虑,您可能需要一些框架来提供对视图激活生命周期的某种程度的控制。

在数据绑定的能力和可靠性方面,我相信 Knockout。我已经广泛使用它,并且越来越喜欢它。如果你喜欢 Knockout 的感觉,可以考虑一下 Durandal。Durandal 是一个不错的框架,能够满足许多“spa”Web 项目的需求。它是基于几个经过验证的库构建的客户端框架,包括 Knockout。它比 Angular 更加轻量级,可能更易于使用。

我们正在使用 Durandal 和 Knockout 构建一个相当大的 ASP.Net MVC 网站,并结合额外的门面模式来从开发角度加强网站的整体设计。与 ASP.Net MVC 的集成直截了当。我不建议尝试使用现有的服务端 Knockout,因为我认为这样会限制 MVVM 模式的真正威力。


2
SPA - 单页应用程序 - fireydude
1
建议不要使用服务器端的knockoutmvc,这里有关于它的真相:https://dev59.com/fWgu5IYBdhLWcg3wDS6j#11618190。 - harsimranb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接