angular学习(四)—— Services

前端之家收集整理的这篇文章主要介绍了angular学习(四)—— Services前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Services简介

angular的services非常适合用依赖注入的方式将对象组合在一起,你能用services跨app去组合和分享你的代码
angular services有以下两个特点:
1.延迟实例化——当有app的组件依赖它的时候才会去实例化。
2.单例模式——app的组件调用services时,只会获得一个services工厂实例化后的引用。

Services使用

使用services很简单,你只需为app的组件增加依赖即可,angular的DI系统为了做剩下的事情。

useservices.html

  1. <script src="../script/angular.min.js"></script>
  2. <script src="script.js"></script>
  3. <body ng-app="myServiceModule">
  4. <div id="simple" ng-controller="MyController">
  5. <p>Let's try this simple notify service,injected into the controller...</p>
  6. <input ng-init="message='test'" ng-model="message" >
  7. <button ng-click="callNotify(message);">NOTIFY</button>
  8. <p>(you have to click 3 times to see an alert)</p>
  9. </div>
  10. </body>

script.js

  1. (function(angular) { 'use strict'; angular. module('myServiceModule',[]). controller('MyController',['$scope','notify',function ($scope,notify) { $scope.callNotify = function(msg) { notify(msg); }; }]). factory('notify',['$window',function(win) { var msgs = []; return function(msg) { msgs.push(msg); if (msgs.length == 3) { win.alert(msgs.join("\n")); msgs = []; } }; }]); })(window.angular);

Services创建

开发者可以通过使用module注册services名称和services的工厂方法来定义services。
services的工厂方法可以返回一个单例对象或者函数。该对象或函数可以任意注入到依赖于该services的组件中。

Services注册

services可以使用module API来注册,通常使用module 工厂 api来注册

  1. var myModule = angular.module('myModule',[]);
  2. myModule.factory('serviceId',function() {
  3. var shinyNewServiceInstance;
  4. // factory function body that constructs shinyNewServiceInstance
  5. return shinyNewServiceInstance;
  6. });

注意你注册的不是一个services实例,仅仅是一个services的工厂方法,只有当被调用时才会进行实例化。

Dependencies

services也可以有自己的依赖,就像在controller中声明依赖一样,services可以在他的工厂方法中声明依赖。
下面的示例module有两个services,每个services有不同的依赖。

  1. var batchModule = angular.module('batchModule',[]);
  2.  
  3. /** * The `batchLog` service allows for messages to be queued in memory and flushed * to the console.log every 50 seconds. * * @param {*} message Message to be logged. */
  4. batchModule.factory('batchLog',['$interval','$log',function($interval,$log) {
  5. var messageQueue = [];
  6.  
  7. function log() {
  8. if (messageQueue.length) {
  9. $log.log('batchLog messages: ',messageQueue);
  10. messageQueue = [];
  11. }
  12. }
  13.  
  14. // start periodic checking
  15. $interval(log,50000);
  16.  
  17. return function(message) {
  18. messageQueue.push(message);
  19. }
  20. }]);
  21.  
  22. /** * `routeTemplateMonitor` monitors each `$route` change and logs the current * template via the `batchLog` service. */
  23. batchModule.factory('routeTemplateMonitor',['$route','batchLog','$rootScope',function($route,batchLog,$rootScope) {
  24. return {
  25. startMonitoring: function() {
  26. $rootScope.$on('$routeChangeSuccess',function() {
  27. batchLog($route.current ? $route.current.template : null);
  28. });
  29. }
  30. };
  31. }]);

1.batchLog services依赖于内置的$interval service和$log services。
2.routeTemplateMonitor services依赖于内置的$route service和自定义的batchLog services。
3.两个services都用数组来声明他们的依赖
4.数据的标识符的顺序和工厂方法中的顺序是一致的。

$provide注册Services

你可以通过module的config函数中的$provide对象来注册services

  1. angular.module('myModule',[]).config(['$provide',function($provide) {
  2. $provide.factory('serviceId',function() {
  3. var shinyNewServiceInstance;
  4. // factory function body that constructs shinyNewServiceInstance
  5. return shinyNewServiceInstance;
  6. });
  7. }]);

这种技术常用来在单元测试中模拟services的依赖关系

猜你在找的Angularjs相关文章