• 技术文章 >web前端 >js教程

    谈谈AngularJS中Providers之间的差异

    青灯夜游青灯夜游2021-02-22 17:56:41转载417

    相关教程推荐:《angular教程

    什么是Provider?

    angularjs文档对provider的定义:

    provider是一个带有$get()方法的对象。injector调用$get方法创建一个新的service的实例。provider还有一些其他的方法,可以用来配置provider。

    AngularJS使用$provide注册新的providers。providers基本上都会创建一个新实例, 但每个provider只创建一次。$provide提供了6种方法创建自定义provider, 我会用简单的代码示例分别解释他们。

    6种方法如下:

    Constant

    constant能被injected到任何地方。constant不能被decorator拦截, 意味着constant的值永远不能被改变。

    var app = angular.module('app', []); 
    app.config(function ($provide) {
      $provide.constant('movieTitle', 'The Matrix');
    }); 
    
    app.controller('ctrl', function (movieTitle) {
      expect(movieTitle).toEqual('The Matrix');
    });

    AngularJS提供了一种更简便的方式创建constant. 你可以将上面3至5行的代码重写为:

    app.constant('movieTitle', 'The Matrix');

    Value

    value是一个简单的可被注入的值,可以是string, number, 也可以是function。
    与constant不同的是:value不能被注入到configurations, 但value能被decorators拦截。

    var app = angular.module('app', []); 
    app.config(function ($provide) {
     $provide.value('movieTitle', 'The Matrix')
    });
    
    app.controller('ctrl', function (movieTitle) {
     expect(movieTitle).toEqual('The Matrix');
    })

    创建value的简单方法:

    app.value('movieTitle', 'The Matrix');

    Service

    service是一个可以注入的构造函数。如果你想,你可以在函数中指定需要的依赖。

    service是一个单例, 只被创建一次。services是一个很好的方式,用于控制器之间传递数据,如共享数据。

    var app = angular.module('app' ,\[\]); 
    app.config(function ($provide) {
     $provide.service('movie', function () {
       this.title = 'The Matrix';
     });
    });
    
    app.controller('ctrl', function (movie) {
     expect(movie.title).toEqual('The Matrix');
    });

    创建service简单方式:

    app.service('movie', function () {
     this.title = 'The Matrix';
    });

    Factory

    factory是一个可注入的函数。

    与service的相同点:factory也是一个单例,也可以在此函数中指定依赖。

    区别是:factory注入一个普通函数,AngularJs将调用此函数,而service注入一个构造函数。

    service是一个构造函数,要调用new创建一个新对象。而用factory,你可以让这个函数返回你想要的任何东西。
    你将会看到,factory是一个只有$get方法的provider。

    var app = angular.module('app', []); 
    app.config(function ($provide) {
     $provide.factory('movie', function () {
       return {
         title: 'The Matrix';
       }
     });
    }); 
    
    app.controller('ctrl', function (movie) {
     expect(movie.title).toEqual('The Matrix');
    });

    创建factory的简单方式:

    app.factory('movie', function () {
     return {
       title: 'The Matrix';
     }
    });

    Decorator

    decorator可以修改或封装其它的providers,但constant不能被装饰。

    var app = angular.module('app', []); 
    app.value('movieTitle', 'The Matrix'); 
    app.config(function ($provide) {
     $provide.decorator('movieTitle', function ($delegate) {
       return $delegate + ' - starring Keanu Reeves';
     });
    });
    
    app.controller('myController', function (movieTitle) {
     expect(movieTitle).toEqual('The Matrix - starring Keanu Reeves');
    });

    Provider

    provider是所有providers中最复杂的,可以有复杂的creation函数和配置选项。

    provider实际是一个可配置的factory。 provider接受一个对象或构造函数。

    var app = angular.module('app', []); 
    app.provider('movie', function () {
     var version;
     return {
       setVersion: function (value) {
         version = value;
       },
       $get: function () {
         return {
           title: 'The Matrix' + ' ' + version
         }
       }
     }
    });
    
    app.config(function (movieProvider) {
     movieProvider.setVersion('Reloaded');
    });
    
    app.controller('ctrl', function (movie) {
     expect(movie.title).toEqual('The Matrix Reloaded');
    });

    总结

    所有的providers只会被实例化一次,因此他们都是单例的。

    除了constant,其他的providers都可以被decorated。

    constant是一个值, 可以被注入到任何地方,它的值不能被改变。

    value是一个简单的可注入的值。

    service是一个可注入的构造函数。

    factory是以个可注入的函数。

    decorator可以修改或封装其它的providers,除了constant。

    provider是一个可配置的factory。

    英文原文地址:https://xebia.com/blog/differences-between-providers-in-angularjs/

    相关推荐:编程教学

    以上就是谈谈AngularJS中Providers之间的差异的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:segmentfault,如有侵犯,请联系admin@php.cn删除
    专题推荐:AngularJS Providers
    上一篇:用JQ + CSS实现浪漫表白必备 下一篇:10个从喜到悲的Angular面试题
    线上培训班

    相关文章推荐

    • 在Angular里ViewProviders和Providers的区别• Angular和AngularJS间有什么关系• angularjs是什么?为什么用angularjs?• bootstrap与angularjs区别• Angular与angularjs、react和vue的简单对比

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网