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

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

我不想详细比较jQuery和AngularJS。


当前回答

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

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

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

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

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

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

其他回答

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

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

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

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

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

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

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

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

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

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

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

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

这些都是很好但很长的答案。

总结我的经验:

控制器和提供者(服务、工厂等)用于修改数据模型,而不是HTML。HTML和指令定义了模型的布局和绑定。如果需要在控制器之间共享数据,请创建一个服务或工厂-它们是在应用程序中共享的单体。如果您需要HTML小部件,请创建一个指令。如果您有一些数据并且正在尝试更新HTML。。。停下!更新模型,并确保HTML绑定到模型。

jQuery

jQuery使getElementByHerpDerp等长得离谱的JavaScript命令变得更短,并且跨浏览器。

角度JS

AngularJS允许您制作自己的HTML标记/属性,这些标记/属性可以很好地处理动态web应用程序(因为HTML是为静态页面设计的)。

编辑:

说“我有jQuery背景,我在AngularJS中如何思考?”就像说“我拥有HTML背景,我如何在JavaScript中思考?”你问这个问题的事实表明你很可能不理解这两个资源的基本目的。这就是为什么我选择通过简单地指出根本区别来回答这个问题,而不是通过列表来回答“AngularJS使用指令,而jQuery使用CSS选择器来创建一个jQuery对象,该对象执行这和那等操作……”。这个问题不需要冗长的回答。

jQuery是一种使浏览器中的JavaScript编程更容易的方法。更短的跨浏览器命令等。

AngularJS扩展了HTML,因此您不必为了创建应用程序而到处放置<div>。它使HTML实际上适用于应用程序,而不是它的设计目的,即静态的教育网页。它使用JavaScript以迂回的方式实现了这一点,但基本上它是HTML的扩展,而不是JavaScript。

作为一个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

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