zoukankan      html  css  js  c++  java
  • angular的service与factory

    angular里的service是一个单例对象,在应用生命周期结束的时候(关闭浏览器)才会被清除。而controllers在不需要的时候就会被销毁了。

    factory是angular里的一种service.

    Angular里面创建service最简单的方式是使用factory()方法。

    例子

    angular.module('myApp.services')
    .factory('User', function($http) { // injectables go here
      var backendUrl = "http://localhost:3000";  

    var service = { // our factory definition user: {}, setName: function(newName) { service.user['name'] = newName; }, }; return service; });
    • 什么时候使用factory()方法

    在service里面当我们仅仅需要的是一个方法和数据的集合且不需要处理复杂的逻辑的时候,factory()是一个非常不错的选择。

    注意:需要使用.config()来配置service的时候不能使用factory()方法

    service()通过构造函数的方式让我们创建service,我们可以使用原型模式替代javaScript原始的对象来定义service。

    例子

    angular.module('myApp.services')
    .service('User', function($http) { // injectables go here
      var self = this; // Save reference
      this.user = {};
      this.backendUrl = "http://localhost:3000";
      this.setName = function(newName) {
        self.user['name'] = newName;
      }
      this.save = function() {
        return $http.post(self.backendUrl + '/users', {
          user: self.user
        })
      }
    });

    service()方法很适合使用在功能控制比较多的service里面

    它是一个可注入的构造器,在AngularJS中它是单例的,用它在Controller中通信或者共享数据都很合适

    service里面可以不用返回东西,因为AngularJS会调用new关键字来创建对象。但是返回一个自定义对象也不会出错。

    注意:需要使用.config()来配置service的时候不能使用service()方法

    Factory

    它是一个可注入的function,它和service的区别就是:factory是普通function,而service是一个构造器(constructor),这样Angular在调用service时会用new关键字,而调用factory时只是调用普通的function,所以factory可以返回任何东西,而service可以不返回.

    factory可以返回任何东西,它实际上是一个只有$get方法的provider

    provider

    provider是他们的老大,上面的几乎(除了constant)都是provider的封装,provider必须有一个$get方法,当然也可以说provider是一个可配置的factory

    例子:

    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');
    });

    //注意这里config方法注入的是movieProvider,上面定义了一个供应商叫movie,但是注入到config中不能直接写movie
    因为前文讲了注入的那个东西就是服务,是供应商提供出来的,而config中又只能注入供应商(两个例外是$provide$injector),
    所以用驼峰命名法写成movieProviderAngular就会帮你注入它的供应商。

    1) 用 Factory 就是创建一个对象,为它添加属性,然后把这个对象返回出来。你把 service 传进 controller 之后,在 controller 里这个对象里的属性就可以通过 factory 使用了。

    2) Service 是用"new"关键字实例化的。因此,你应该给"this"添加属性,然后 service 返回"this"。你把 service 传进 controller 之后,在controller里 "this" 上的属性就可以通过 service 来使用了。

    参考:

    https://segmentfault.com/a/1190000003096933

    http://www.oschina.net/translate/angularjs-factory-vs-service-vs-provider

    http://my.oschina.net/tanweijie/blog/295067

  • 相关阅读:
    sql 删除默认索引,对象 依赖于 列,由于一个或多个对象访问此列
    sql 重复数据查询
    Sql 查询结果 根据某个字段值 变更另外一个字段值 case when
    使用ABP框架踩过的坑系列3
    使用ABP框架踩过的坑系列5
    使用ABP框架踩过的坑系列4
    使用ABP框架踩过的坑系列2
    使用ABP框架踩过的坑系列1
    java rest框架jersey数组单记录问题解决
    测试工程师面试常见逻辑题
  • 原文地址:https://www.cnblogs.com/isdom/p/webclips065.html
Copyright © 2011-2022 走看看