资讯专栏INFORMATION COLUMN

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

Cristic / 2266人阅读

摘要:代码代码功夫瑜伽语法糖功夫瑜伽它是一个可注入的构造器在中它是单例的用它在中通信或者共享数据都合适功夫瑜伽语法糖功夫瑜伽注意在里面可以不用返回东西因为会调用关键字来创建对象。

AngularJS 的供应商($provide)

$provide 服务负责告诉 AngularJS 如何创建一个新的可注入的东西: 即服务。

服务会被叫做供应商的东西来定义, 可以使用 $provide 来创建一个供应商。

创建供应商的方法:

使用 $provide 中的 provider() 方法来定义一个供应商;

通过要求 $provide 被注入一个应用的 config 函数中来获得 $provide 服务;

定义供应商的方法们

constant

value

service

factory

provider

decorator

1. constant

定义常量的, 它定义的值不能被改变, 它可以被注入到任何地方, 但是不能被装饰器(decorator) 装饰。

DEMO:

HTML 代码:





    demo
    
    



    

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 代码:





    demo
    
    



    

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://www.ucloud.cn/yun/86877.html

相关文章

  • AngularJSProvider们:ServiceFactory区别

    摘要:引言看了很多文章可能还是不太说得出中的几个创建供应商的方法到底有啥区别,啥时候该用啥,之前一直傻傻分不清楚,现在来总结一下。 引言 看了很多文章可能还是不太说得出AngularJS中的几个创建供应商(provider)的方法(factory(),service(),provider())到底有啥区别,啥时候该用啥,之前一直傻傻分不清楚,现在来总结一下。 下文中泛指统一用中文,英文即为特...

    jone5679 评论0 收藏0
  • AngularJSfactoryserviceprovider区别

    摘要:首先创建我们的构造函数这是一个典型的构造函数。所以,我们首先知道的就是无论我们是否能够在代码里面看见,构造函数是会返回一个对象的。 翻译自 http://tylermcginnis.com/angularjs-factory-vs-service-vs-provider/ 当你开始使用Angular的时候,你会发现,你总是会让你的控制器和作用域充满各种不必要的逻辑。你应该早点意识到一个...

    lanffy 评论0 收藏0
  • AngularJs 入门(二)--模块

    摘要:同名模块已经初始化的模块保存在一个叫的缓存对象中,是模块名,是模块对象。调用注入器的方法执行模块的所有方法。检查该注入器中是否存在指定的服务。如果是数组,最后一个必须是的构造函数,前面的就是构造函数的参数名。 模块 模块是指写Angular应用的代码片段,这样可以使代码分离开来,因此代码会更好维护,可读和测试。还可以在module里定义代码依赖关系,可以调用一个模块,再在代码中定义这个...

    Yangyang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<