angularjs – angular.service对angular.factory
我已经看到
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都帮助你管理单身。无论注入服务或函数的位置或次数,您都将获得相同的对象或函数的引用。 (除了当工厂简单地返回一个像数字或字符串一样的值时,在这种情况下,你总是得到相同的值,但不是一个引用。) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |