AngularJS之Factory vs Service vs Provider
转自:http://www.tuicool.com/articles/rABfUvm 当你初试 Angular 时,很自然地就会往 controller 和 scope 里堆满不必要的逻辑。一定要早点意识到,controller 这一层应该很薄;也就是说,应用里大部分的业务逻辑和持久化数据都应该放在 service 里。我每天都会在 Stack Overflow 上看到几个同类的问题,关于如何在 controller 里保存持久化数据。这就不是 controller 该干的事。出于内存性能的考虑,controller 只在需要的时候才会初始化,一旦不需要就会被抛弃。因此,每次当你切换或刷新页面的时候,Angular 会清空当前的 controller。与此同时,service 可以用来永久保存应用的数据,并且这些数据可以在不同的 controller 之间使用。 Angular 提供了3种方法来创建并注册我们自己的 service。 Factory Service Provider 如果你是“太长的不看” 1) 用 Factory 就是创建一个对象,为它添加属性,然后把这个对象返回出来。你把 service 传进 controller 之后,在 controller 里这个对象里的属性就可以通过 factory 使用了。 FactoryExample1 ServiceExample2 ProviderExample3 为了准确表现出 Factory、Service 和 Provider 之间的差别,下面我们用 3 种不同的方式来构建同一个服务。这个服务会用到 iTunes API 以及使用 $q 的 promise。 1) FactoryFactory 是创建和配置服务最常见的方式。除了“快速浏览”之外,其实没有什么要补充的。只需创建一个对象,为它添加属性,然后返回这个对象就可以了。当你把 factory 传进 controller 中,对象的这些属性就可以通过 factory 访问。更详细的例子如下: 首先创建一个对象,然后返回这个对象,如下。 factory1-4 现在让我们向回调函数中添加一些“private” 变量。当然 controller中是无法直接访问这些变量的,不过我们最终还是会在“service”中设置setter和个getter 方法,以便必要时修改这些“private”变量。 factory4-5 baseUrl 是iTunes API要求的根URL _artist 是我们想要查找的艺术家 _finalUrl 是最终的权限定URL,即我们调用iTunes的入口 makeUrl 是一个创建并返回友好的iTunesURL的函数 既然我们的帮手/私有变量和函数放在的合适的位置,那么让我们向“service”对象中添加一些属性。无论我们向”service“中添加什么, 我们都能在任意一个我们传递进‘myFactory’ 的controller中使用。 我们来创建setArtist和getArtist方法来简单的返回或设置artist。同样创建一个方法使用我们创建的URL来调用iTunes API。这个方法将返回一个从iTunes API获取数据后便会满足的promise。如果你对Angular的promise接触不多,我强烈推荐你深入的学习一下它。 setArtist 接受一个artist并且允许你设置artist getArtist 返回artist callItunes 首先调用makeUrl()方法以便构建
factory6 现在我们的factory完成了。我们可以将”myFactory”注入到任意controller中了,然后就可以调用我们添加到service对象中的方法了(setArtist,getArtist,和callItunes)。 factory2-7 2) Service当我们创建一个Service时,我们所知道的最重要事可能就是Service通过new关键字实例化对象。这应该可以使熟悉JavaScript的人了解到了这段代码的作用。但对于那些JS背景有限,或者不太熟悉new关键字的作用的人来说可能有点困难。那就让我们来重温一下JavaScript的基本功能,以便帮助我们了解Service究竟做了什么。 让我们先定义一个函数,然后通过new关键字来调用它,看看当解释器遇到了new关键字的时候做了些什么工作,以便帮助我们了解使用new关键字来实例化一个函数时究竟有什么变化。这个的最终结果应该和Service是一样的。 首先,让我们定义一个构造器。 personConstructor-8 接下来,让我们给Person的prototype对象添加一个方法,这个方法对所有Person ‘类’的实例都是可用的。 person.prototype-9 既然我们已经有了一个Person的构造器,并在在其prototype上定义了一个sayName方法,那就让我们去创建一个Person的实例,并调用这个sayName方法。 personInstance-10 PersonCode-11 下面的代码演示了在JavaScript中使用new关键之后所做的事。它是上面这一段文字的一个基本的代码示例。我已经把从JS解释器的角度来看整个过程的代码写在了注释里。 PersonCommented-12 在创建一个Service时,需要理解的最重要的一件事就是我们使用new关键字去实例化Service对象。结合我们从上面的例子所了解到的知识,你应该已经意识到你可以将一些属性和方法直接添加到this上,之后,在创建Service对象时,this会被作为返回值返回。让我们来看一下这种工作方式。 我们不用像之前Factory中的例子那样创建一个对象,然后返回这个对象。因为我们使用了new关键字来调用,解释器会创建一个对象,并关联它的prototype对象,然后将该对象返回,而不用我们去做这些工作。 首先,让我们创建我们的私有辅助函数。它应该看起来和我们在factory中所作的工作很类似。由于我已经在factory的例子中解释过每一行代码的含义了,所以我不会在这里多作解释,如有疑惑,请再次回味一下factory的例子。 ServiceBase-13 serviceservice-14 3) Provider要记住的关于Provider的最重要的事情是,它们是你可以传递到应用程序的app.config部分唯一的服务。如果你需要在你的服务对象可以在你的应用程序之外任何地方都可用之前改变它的某些部分,这是非常重要的。虽然Services/Factories很相似,但也有一些差异,我们将会讨论它们。 首先,我们用与我们建立Service 和 Factory类似的方式来建立我们的Provider。下面的变量是我们的’私人’和辅助功能。 ProviderBase-16 必须要注意的一点是只有这些变量和函数是可以在我们的app.config函数中访问的。这曾一度使我感到困惑,所以你最好也要知道这点不同之处。你可以把Provider想象成由两部分组成。第一部分的变量和函数是可以在app.config函数中访问的,因此你可以在它们被其他地方访问到之前来修改它们(如上所示)。第二部分(如下所示) 的变量和函数是可以在任何传入了’myProvider‘的控制器中进行访问的。 当你使用Provider创建一个service时,唯一的可以在你的控制器中访问的属性和方法是通过
provider$get-17 ProviderService-18 ProviderCtrl-19 appconfig-20 谢谢您的阅读,我希望这有助于你能辨别在Angular中Factory,Service,和 Provider之间的差异。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- webservices数据交换-xml格式
- Axis2.x WebService开发指南-目录索引
- angularjs – Firebase signInWithEmailAndPassword()400()
- 如何使用bash命令或Ruby使用ffmpeg将mp4文件批量转换为ogg
- 在Unix / Bash中,“xargs -p”是在运行任何命令之前提示确认
- 【转】angularJS的兄弟controller之间如何正确的通信
- 【数据结构】堆 Heap
- 与Angularjs 1.X中的$watch相比,rxjs observable如何执行?
- shell获取文件大小及checksum
- scala – 将特定目录及其内容添加到Universal目标