加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – angular.service对angular.factory

发布时间:2020-12-17 09:36:29 所属栏目:安全 来源:网络整理
导读:我已经看到 angular.factory()和 angular.service()用于声明服务;然而,我 cannot find angular.service在官方文档的任何地方。 这两种方法有什么区别?哪个应该用于什么(假设他们做不同的事情)? angular.service('myService',myServiceFunction); angular.
我已经看到 angular.factory()和 angular.service()用于声明服务;然而,我 cannot find angular.service在官方文档的任何地方。

这两种方法有什么区别?哪个应该用于什么(假设他们做不同的事情)?

angular.service('myService',myServiceFunction);
  angular.factory('myFactory',myFactoryFunction);

我有困难包围我的头这个概念,直到我把它给自己这样的方式:

服务:你写的功能将是新的:

myInjectedService  <----  new myServiceFunction()

工厂:你写的函数(构造函数)将被调用:

myInjectedFactory  <---  myFactoryFunction()

你用这个做什么取决于你,但有一些有用的模式…

比如编写一个服务函数来公开一个公共API:

function myServiceFunction() {
  this.awesomeApi = function(optional) {
    // calculate some stuff
    return awesomeListOfValues;
  }
}
---------------------------------------------------------------------------------
// Injected in your controller
$scope.awesome = myInjectedService.awesomeApi();

或者使用工厂函数公开公共API:

function myFactoryFunction() {
  var aPrivateVariable = "yay";

  function hello() {
    return "hello mars " + aPrivateVariable;
  }

  // expose a public API
  return {
    hello: hello
  };
}
---------------------------------------------------------------------------------
// Injected in your controller
$scope.hello = myInjectedFactory.hello();

或者使用工厂函数返回构造函数:

function myFactoryFunction() {
    return function() {
        var a = 2;
        this.a2 = function() {
            return a*2;
        };
    };
}
---------------------------------------------------------------------------------
// Injected in your controller
var myShinyNewObject = new myInjectedFactory();
$scope.four = myShinyNewObject.a2();

使用哪一个?

你可以完成同样的事情与两者。然而,在某些情况下,工厂给你一个更灵活的创建一个更简单的语法的注入。这是因为虽然myInjectedService必须始终是一个对象,myInjectedFactory可以是一个对象,一个函数引用或任何值。例如,如果你编写一个服务来创建一个构造函数(如上面的最后一个例子),它将被实例化如下:

var myShinyNewObject = new myInjectedService.myFunction()

这可能比这不太可取:

var myShinyNewObject = new myInjectedFactory();

(但是你应该小心使用这种类型的模式,因为控制器中的新对象创建了难以模拟测试的难以跟踪的依赖。更好的服务管理对象的集合你比使用new()wily-nilly。)

还有一件事,他们都是单身人士…

还要记住,在这两种情况下,angular都帮助你管理单身。无论注入服务或函数的位置或次数,您都将获得相同的对象或函数的引用。 (除了当工厂简单地返回一个像数字或字符串一样的值时,在这种情况下,你总是得到相同的值,但不是一个引用。)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读