AngularJS 中的 Factory、Service以及 Provider的区分

AngularJS 的供给商($provide)

$provide 效劳担任通知 AngularJS 怎样建立一个新的可注入的东西: 即效劳。

效劳会被叫做供给商的东西来定义, 能够运用 $provide 来建立一个供给商。

建立供给商的要领:

  • 运用 $provide 中的 provider() 要领来定义一个供给商;

  • 经由过程请求 $provide 被注入一个运用的 config 函数中来取得 $provide 效劳;

《AngularJS 中的 Factory、Service以及 Provider的区分》

定义供给商的要领们

  • constant

  • value

  • service

  • factory

  • provider

  • decorator

1. constant

定义常量的, 它定义的值不能被转变, 它能够被注入到任何地方, 然则不能被装潢器(decorator) 装潢。

DEMO:

HTML 代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <title>demo</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>

<body>
    <div ng-app="myApp">
        <div ng-controller="myController">

        </div>
    </div>
    <script src="js/angular.js">
    </script>
    <script src="js/service.js"></script>
</body>

</html>

JS 代码:

var myApp = angular.module('myApp', [])
myApp.config(function($provide) {
    $provide.constant('movieTitle', '工夫瑜伽')
})
myApp.controller('myController', function(movieTitle) {
    console.log('movieTitle: ', movieTitle);
})

语法糖:

myApp.constant('movieTitle', '工夫瑜伽')

2. value

它能够是 stringnumberfunction, 它和 constant 的不同之处在于, 它能够被修正, 不能被注入到 config 中, 然则它能够被 decorator 装潢。

HTML 代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <title>demo</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
</head>

<body>
    <div ng-app="myApp">
        <div ng-controller="myController">

        </div>
    </div>
    <script src="js/angular.js">
    </script>
    <script src="js/service.js"></script>
</body>

</html>

JS 代码:

var myApp = angular.module('myApp', [])

myApp.config(function($provide) {
    $provide.value('movieTitle', '工夫瑜伽')
})

myApp.controller('myController', function(movieTitle) {
    console.log('movieTitle: ', movieTitle);
})

语法糖:

myApp.value('movieTitle', '工夫瑜伽')

3. service

它是一个可注入的组织器, 在 AngularJS 中它是单例的, 用它在 Controller 中通讯或许同享数据都适宜

var myApp = angular.module('myApp', [])

myApp.config(function($provide) {
    $provide.service('movie', function() {
        this.title = '工夫瑜伽'
    })
})

myApp.controller('myController', function(movie) {
    console.log('movieTitle: ', movie.title);
})

语法糖:

myApp.service('movie', function () {
    this.title = '工夫瑜伽'
})

注重:

service 内里能够不必返回东西, 由于 AngularJS 会挪用 new 关键字来建立对象。然则返回一个自定义对象彷佛也不会有错。

4. factory

它是一个可注入的 function, 它和 service 的区分就是: factory 是一般的 function, 而 service 是一个组织器(constructor), 如许 AngularJS 在挪用 service 时会用 new 关键字, 而挪用 factory 时只是挪用一般的 function, 所以 factory 能够返回任何东西, 而 service 能够不返回 (可查阅 new 关键字的作用)

var myApp = angular.module('myApp', [])

myApp.config(function($provide) {
    $provide.factory('movie', function() {
        return {
            title: '工夫瑜伽'
        }
    })
})

myApp.controller('myController', function(movie) {
    console.log('movieTitle: ', movie.title);
})

语法糖:

$provide.factory('movie', function() {
    return {
        title: '工夫瑜伽'
    }
})

注重:

factory 能够返回任何东西, 它实际上是一个只要 $get 要领的 provider

5. provider

provider 是他们的老大, 上面的险些(除了 constant) 都是 provider 的封装, provider 必须有一个 $get 要领, 固然也能够说 provider 是一个可设置的 factory

JS 代码:

var myApp = angular.module('myApp', [])

myApp.provider('movie', function() {
    var version
    return {
        setVersion: function(value) {
            version = value
        },
        $get: function() {
            return {
                title: '工夫瑜伽 ' + version
            }
        }
    }
})

myApp.config(function(movieProvider) {
    movieProvider.setVersion('正在热播')
})

myApp.controller('myController', function(movie) {
    console.log('movieTitle: ', movie.title);
})

注重:

  • 这里 config 要领注入的是 movieProvider, config 要领中只能注入供给商(两个破例是 $provide$injector),用驼峰定名法写成 movieProvider, AngularJS 会自动帮你注入它的供给商。

  • movie 是一个供给商

6.decorator

decorator 不是 provider, 它是用来装潢别的 provider 的, 它不能装潢 constant(由于 constant 不是经由过程 provider() 要领建立的)。

JS 代码:

var myApp = angular.module('myApp', [])

// myApp.value('movieTitle', '工夫瑜伽6')
myApp.config(function($provide) {
    $provide.value('movieTitle', '工夫瑜伽7')

    $provide.decorator('movieTitle', function($delegate) {
        return $delegate + ' - 测试'
    })
})

myApp.controller('myController', function(movieTitle) {
    console.log('movieTitle: ', movieTitle);
})

总结

  • 一切的供给商都只被实例化一次, 也就是说它们都是单例的

  • 除了 constant, 一切的供给商都能够被装潢器(decorator)装潢

  • value 就是一个简朴可注入的值

  • service 是一个可注入的组织器

  • factory 是一个可注入的要领

  • decorator 能够修正或封装其他的供给商(除了 constant)

  • provider 是一个可设置的 factory

    原文作者:无名小子
    原文地址: https://segmentfault.com/a/1190000008634099
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞