假设我熟悉在jQuery中开发客户端应用程序,但现在我想开始使用AngularJS。你能描述一下必要的范式转变吗?以下几个问题可能有助于您确定答案:

如何以不同的方式构建和设计客户端web应用程序?最大的区别是什么?我应该停止做什么/使用什么;我应该开始做什么?是否有服务器端的考虑/限制?

我不想详细比较jQuery和AngularJS。


当前回答

作为一个JavaScriptMV*初学者,纯粹专注于应用程序架构(而不是服务器/客户端的问题),我当然会推荐以下资源(我很惊讶还没有提到):AddyOsmani的JavaScript设计模式,作为不同JavaScript设计模式的介绍。本答案中使用的术语取自上述链接文档。我不打算重复在公认的答案中措辞很好的内容。相反,这个答案与支持AngularJS(和其他库)的理论背景联系起来。

像我一样,你会很快意识到AngularJS(或Ember.js、Durandal和其他MV*框架)是一个复杂的框架,它集合了许多不同的JavaScript设计模式。

我还发现,在深入到一个全局框架之前,分别测试(1)本机JavaScript代码和(2)这些模式中的每一个的较小库更容易。这让我更好地理解了框架解决了哪些关键问题(因为你个人面临着这个问题)。

例如:

JavaScript面向对象编程(这是一个谷歌搜索链接)。它不是一个库,但肯定是任何应用程序编程的先决条件。它教会了我原型、构造函数、单例和装饰器模式的本地实现facade模式的jQueryUndercore(如用于操作DOM的WYSIWYG)原型/构造函数/混合模式的Prototype.js模块模式/AMD需要js/Coll.js可观察的发布/订阅模式的KnockoutJS

注:此列表不完整,也不是“最佳库”;它们正好是我用过的图书馆。这些库还包括更多的模式,这些模式只是它们的主要焦点或初衷。如果你觉得这个列表中缺少一些东西,请在评论中提及,我很乐意补充。

其他回答

你能描述一下必要的范式转变吗?

命令与声明

使用jQuery,您可以一步一步地告诉DOM需要发生什么。使用AngularJS,您可以描述您想要的结果,但不描述如何实现。还有,看看马克·拉乔克的答案。

如何以不同的方式构建和设计客户端web应用程序?

AngularJS是一个使用MVC模式的完整客户端框架(查看它们的图形表示)。它非常注重关注点的分离。

最大的区别是什么?我应该停止做什么/使用什么;我应该开始做什么?

jQuery是一个库

AngularJS是一个漂亮的客户端框架,高度可测试,它结合了许多很酷的东西,如MVC、依赖注入、数据绑定等等。

它专注于关注点和测试的分离(单元测试和端到端测试),这有助于测试驱动开发。

最好的开始方式是完成他们很棒的教程。你可以在几个小时内完成这些步骤;然而,如果你想掌握幕后的概念,它们包括大量的参考资料以供进一步阅读。

是否有服务器端的考虑/限制?

您可以在已经使用纯jQuery的现有应用程序上使用它。然而,如果您想充分利用AngularJS特性,可以考虑使用RESTful方法对服务器端进行编码。

这样做将允许您利用他们的资源工厂,这将创建服务器端RESTful API的抽象,并使服务器端调用(获取、保存、删除等)变得异常简单。

作为一个JavaScriptMV*初学者,纯粹专注于应用程序架构(而不是服务器/客户端的问题),我当然会推荐以下资源(我很惊讶还没有提到):AddyOsmani的JavaScript设计模式,作为不同JavaScript设计模式的介绍。本答案中使用的术语取自上述链接文档。我不打算重复在公认的答案中措辞很好的内容。相反,这个答案与支持AngularJS(和其他库)的理论背景联系起来。

像我一样,你会很快意识到AngularJS(或Ember.js、Durandal和其他MV*框架)是一个复杂的框架,它集合了许多不同的JavaScript设计模式。

我还发现,在深入到一个全局框架之前,分别测试(1)本机JavaScript代码和(2)这些模式中的每一个的较小库更容易。这让我更好地理解了框架解决了哪些关键问题(因为你个人面临着这个问题)。

例如:

JavaScript面向对象编程(这是一个谷歌搜索链接)。它不是一个库,但肯定是任何应用程序编程的先决条件。它教会了我原型、构造函数、单例和装饰器模式的本地实现facade模式的jQueryUndercore(如用于操作DOM的WYSIWYG)原型/构造函数/混合模式的Prototype.js模块模式/AMD需要js/Coll.js可观察的发布/订阅模式的KnockoutJS

注:此列表不完整,也不是“最佳库”;它们正好是我用过的图书馆。这些库还包括更多的模式,这些模式只是它们的主要焦点或初衷。如果你觉得这个列表中缺少一些东西,请在评论中提及,我很乐意补充。

我觉得这个问题很有趣,因为我第一次认真接触JavaScript编程是Node.js和AngularJS。我从未学习过jQuery,我想这是一件好事,因为我不必忘记任何东西。事实上,我积极避免使用jQuery解决我的问题,而是只寻找一种“AngularJS方法”来解决它们。因此,我想我对这个问题的回答基本上可以归结为,“像从未学习过jQuery的人一样思考”,并避免任何直接合并jQuery的诱惑(显然AngularJS在某种程度上在幕后使用了它)。

请收听播客JavaScript Jabber:第32集,其中介绍了AngularJS的原创创作者:Misko Hevery&Igor Minar。他们谈论了很多来自其他JavaScript背景,特别是jQuery的AngularJS的感觉。

播客中的一点让我对你的问题有了很多看法:

MISKO:[…]在Angular中,我们很难想到的一件事是,我们如何提供大量逃生舱口,以便您能够逃出去,并基本上找到解决问题的方法。对我们来说,答案是“指令”。有了指令,你就基本上变成了一个普通的小jQueryJavaScript,你可以做任何你想做的事情。IGOR:所以把指令想象成编译器的指令,当你在模板中遇到这个特定的元素或这个CSS时,它会告诉你,你保留这类代码,而这类代码负责DOM树中元素及其下面的所有内容。

可以通过上面提供的链接获得整个事件的记录。

所以,直接回答你的问题:AngularJS非常固执己见,是一个真正的MV*框架。然而,您仍然可以在指令中使用jQuery完成所有您知道和喜爱的非常酷的事情。这不是“我如何做我在jQuery中曾经做过的事情?”的问题,而是“我如何用我在jQuery中曾经做的所有事情来补充AngularJS?”

这是两种截然不同的心态。

它们是苹果和橘子。你不想比较它们。它们是两种不同的东西。AngularJs已经内置了jQuery lite,它允许您执行基本的DOM操作,甚至不包括完整的jQuery版本。

jQuery完全是关于DOM操作的。它解决了所有跨浏览器的问题,否则您将不得不处理,但它不是一个允许您将应用程序划分为AngularJS等组件的框架。

AngularJs的一个优点是它允许您在指令中分离/隔离DOM操作。有内置指令可供您使用,例如ng-click。您可以创建自己的自定义指令,这些指令将包含所有视图逻辑或DOM操作,这样您就不会在应该处理业务逻辑的控制器或服务中混合DOM操作代码。

Angular将应用程序分解为-控制器-服务-视图-等等。

还有一件事,那就是指令。它是一个可以附加到任何DOM元素的属性,您可以在其中使用jQuery,而不必担心jQuery会与AngularJs组件冲突或破坏其架构。

我从我参加的一次会议上听到,Angular的创始人之一表示,他们非常努力地将DOM操作分离出来,所以不要试图将它们重新纳入其中。