AngularJS 讲解五, Factory ,Service , Provider
一. 首先说一下,为什么要引入Factory,Service和Provider这三个Service层。
1.因为我们不应该在controller层写入大量的业务逻辑和持久化数据,controller层越轻薄越好,业务逻辑和持久化数据应该放在Service层。
2.针对内存性能的考虑,controller会在需要的时候才初始化,不需要的话,就会被放弃。所以AngularJS会在刷新页面的时候,清空controller. 而永久保存的数据放在Service层,那么在不同的controller之间可以被调用。
二.AngularJS 提供了三种方法创建并注册自己的Service.
1). Factory
2). Service
3). Provider
三.对Factory,Service,Provider的详解
1).Factory 相当于创建对象,在对象里添加属性和方法,返回这个对象,然后在controller里便可直接用service对象的属性啦
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <!DOCTYPE html> <html> <head> <title></title> <meta charset= "utf-8" /> <script type= "text/javascript" src= "js/angular.js" ></script> <script type= "text/javascript" src= "js/demo1.js" ></script> </head> <body data-ng-app= "demoApp" > <div data-ng-controller= "demoController" > title:<span data-ng-bind= "title" ></span> </div> </body> </html> (function () { angular.module( 'demoApp' , []); angular.module( 'demoApp' ).controller( "demoController" , function ($scope,demoFactory) { $scope.title = demoFactory.getTitle(); }); angular.module( 'demoApp' ).factory( "demoFactory" , function () { var _title = "ruby's test" ; var service = {}; service.getTitle = function () { return _title; } return service; }) })(); |
2).Service 相当于是用new关键字来实例化的Service对象(相当于创建了一个构造器),因此只需要给this添加属性,然后由service返回this. 在controller层通过该service获得这个属性。
1 2 3 4 5 6 7 8 9 | angular.module( 'demoApp' ).controller( "demoController" , function ($scope,demoService) { $scope.title = demoService.getTitle(); }); angular.module( 'demoApp' ).service( 'demoService' , function () { var _title = "Ruby Test service" ; this .getTitle = function () { return _title; } }); |
3).Provider 是唯一一个能传到应用程序.config的服务。所以当想要在controller之前启用,先进行模块范围的配置(对provider的一部分属性值进行配置),就用provider
如果想要在controller控制器里直接调用provider的属性和方法 要放到$get里
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | <!DOCTYPE html> <html> <head> <title></title> <meta charset= "utf-8" /> <script type= "text/javascript" src= "js/angular.js" ></script> <script type= "text/javascript" src= "js/demo1.js" ></script> </head> <body data-ng-app= "demoApp" > <div data-ng-controller= "demoController" > title:<span data-ng-bind= "title" ></span> <br/> thingFromConfig:<span data-ng-bind= "thingFromConfig" ></span> </div> </body> </html> angular.module( 'demoApp' , []); angular.module( 'demoApp' ).controller( "demoController" , function ($scope,demoProvider) { demoProvider.setTitle( "provider service test" ); $scope.title = demoProvider.getTitle(); $scope.thingFromConfig = demoProvider.thingOnConfig; }); angular.module( 'demoApp' ).provider( 'demoProvider' , function () { var _title = "" ; this .thingFromConfig = "" ; this .$ get = function () { return { setTitle: function (t) { _title = t; }, getTitle: function () { return _title; }, thingOnConfig: this .thingFromConfig } } }); angular.module( 'demoApp' ).config(function (demoProviderProvider) { demoProviderProvider.thingFromConfig = "Hello, this is a thing from configuration." ; }); |
四.深入解析 AngularJs的service
首先了解一下$provide
AngularJs有个叫$provide的服务,这个服务可以创建供应商,我们的service都是通过供应商来定义的。
有六个个创建供应商的方法:
1.Factory
2.Service
3.Constant
4.value
5.provider
6.decorator(装饰器)
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 开发的设计和重构,为开发效率服务
· 从零开始开发一个 MCP Server!
· Ai满嘴顺口溜,想考研?浪费我几个小时
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密