我已经看到angular.factory()和angular.service()用于声明服务; 但是,我在官方文档中找不到 angular.service任何地方.
这两种方法有什么区别?应该用什么(假设他们做不同的事情)?
据我了解,当在工厂内部时,我返回一个被注入控制器的对象.在服务内部时,我正在处理使用的对象this而不返回任何内容.
我假设服务总是单例,并且每个控制器都会注入一个新的工厂对象.然而,事实证明,工厂对象也是单身人士?
用于演示的示例代码:
var factories = angular.module('app.factories', []);
var app = angular.module('app', ['ngResource', 'app.factories']);
factories.factory('User', function () {
return {
first: 'John',
last: 'Doe'
};
});
app.controller('ACtrl', function($scope, User) {
$scope.user = User;
});
app.controller('BCtrl', function($scope, User) {
$scope.user = User;
});
Run Code Online (Sandbox Code Playgroud)
当改变user.first的ACtrl事实证明,user.first在BCtrl也发生了变化,比如User是一个单身?
我的假设是在一个带有工厂的控制器中注入了一个新实例?
请在这里忍受我.我知道还有其他答案,例如: AngularJS:Service vs provider vs factory
但是,当你在工厂使用服务时,我仍然无法弄清楚.
据我所知,工厂通常用于创建可由多个控制器调用的"通用"功能:创建通用控制器功能
Angular文档似乎更喜欢工厂而不是服务.他们甚至在使用工厂时提到"服务",这更令人困惑!http://docs.angularjs.org/guide/dev_guide.services.creating_services
那么什么时候才能使用服务?
是否有可能通过服务完成或更容易完成的事情?
幕后有什么不同吗?性能/内存差异?
这是一个例子.除了声明的方法,它们看起来完全相同,我无法弄清楚为什么我会做一个与另一个.http://jsfiddle.net/uEpkE/
更新:从托马斯的回答看来,似乎暗示服务是为了更简单的逻辑和工厂用于更复杂的逻辑与私有方法,所以我更新了下面的小提琴代码,似乎两者都能够支持私人功能?
myApp.factory('fooFactory', function() {
var fooVar;
var addHi = function(foo){ fooVar = 'Hi '+foo; }
return {
setFoobar: function(foo){
addHi(foo);
},
getFoobar:function(){
return fooVar;
}
};
});
myApp.service('fooService', function() {
var fooVar;
var addHi = function(foo){ fooVar = 'Hi '+foo;}
this.setFoobar = function(foo){
addHi(foo);
}
this.getFoobar = function(){
return fooVar;
}
});
function MyCtrl($scope, fooService, fooFactory) {
fooFactory.setFoobar("fooFactory");
fooService.setFoobar("fooService");
//foobars = "Hi fooFactory, …Run Code Online (Sandbox Code Playgroud) 编辑2016年1月:由于这仍然备受关注.自从问这个我已经完成了一些AngularJS项目,并且对于那些我最常用的项目factory,构建了一个对象并在最后返回了对象.我下面的语句是仍然如此,但是.
编辑:我想,我终于明白了两者之间的主要区别,和我有一个代码示例演示.我也在想这个问题所提出的重复不同.重复的说,服务不是实例化,但如果你将其设置为我下面演示,它实际上是.服务可以被设置为是完全一样的工厂.我还将提供显示工厂故障服务的代码,这似乎没有其他答案.
如果我成立VaderService像这样(即服务):
var module = angular.module('MyApp.services', []);
module.service('VaderService', function() {
this.speak = function (name) {
return 'Join the dark side ' + name;
}
});
Run Code Online (Sandbox Code Playgroud)
然后在我的控制,我可以这样做:
module.controller('StarWarsController', function($scope, VaderService) {
$scope.luke = VaderService.speak('luke');
});
Run Code Online (Sandbox Code Playgroud)
通过服务,注入到控制器的VaderService被实例化,所以我可以调用VaderService.speak,但是,如果我将VaderService更改为module.factory,控制器中的代码将不再起作用,这是主要区别.随着工厂,VaderService注入到控制器不实例化,这就是为什么你需要设立一家工厂(见我的问题为例)返回一个对象.
但是,您可以设置在完全相同的方式服务,你可以建立一个工厂(IE有它返回一个对象)和服务的行为完全一样作为一个工厂
鉴于此信息,我认为没有理由使用工厂超过服务,服务可以做任何工厂可以做的更多.
下面原来的问题.
我知道这已经被问的时候加载,但我实在看不出工厂和服务之间的功能差异.我读过这个教程:http://blogs.clevertech.biz/startupblog/angularjs-factory-service-provider
它似乎给一个合理的很好的解释,但是,我设立了我的应用程序如下:
的index.html
<!DOCTYPE html>
<html>
<head>
<title>My App</title>
<script src="lib/angular/angular.js"></script>
<script type="text/javascript" src="js/controllers.js"></script>
<script type="text/javascript" src="js/VaderService.js"></script>
<script type="text/javascript" src="js/app.js"></script>
</head>
<body ng-app="MyApp">
<table ng-controller="StarWarsController">
<tbody>
<tr><td>{{luke}}</td></tr>
</tbody>
</table> …Run Code Online (Sandbox Code Playgroud) 我正在尝试"自定义"mongolab示例以适合我自己的REST API.现在我遇到了这个错误,我不确定我做错了什么:
Error: Unknown provider: ProductProvider <- Product
at Error (unknown source)
at http://localhost:3000/js/vendor/angular.min.js:28:395
at Object.c [as get] (http://localhost:3000/js/vendor/angular.min.js:26:180)
at http://localhost:3000/js/vendor/angular.min.js:28:476
at c (http://localhost:3000/js/vendor/angular.min.js:26:180)
at d (http://localhost:3000/js/vendor/angular.min.js:26:314)
Run Code Online (Sandbox Code Playgroud)
这是我的控制器:
function ProductListCtrl($scope, Product) {
$scope.products = Product.query();
}
Run Code Online (Sandbox Code Playgroud)
这是模块:
angular.module('productServices', ['ngResource']).
factory('Product', ['$resource', function($resource){
var Product = $resource('/api/products/:id', { }, {
update: { method: 'PUT' }
});
return Product;
}]);
Run Code Online (Sandbox Code Playgroud) 我一直在做很多工作Angular.js,总的来说我发现它是一个有趣而强大的框架.
我知道有很多关于服务与工厂与提供商与价值观的讨论,但我仍然对这是什么感到困惑Factory.
Factory已在其他StackOverflow讨论中定义如下:
工厂
语法:module.factory( 'factoryName', function );结果:当将factoryName声明为injectable参数时,将通过调用传递给module.factory的函数引用来提供返回的值.
我发现这个解释很难掌握,并没有增加我对工厂的理解.
有没有人有任何解释或现实生活中的例子来分享正是一个Factory是,为什么你要代替的使用它Service,Provider或者其他?
A service 保存对任何对象的引用.
A factory 是返回任何对象的函数
A provider 是返回任何函数的函数
- p - -
在参考文献中我读到:
最后,重要的是要意识到所有Angular服务都是应用程序单例.这意味着每个注入器只有一个给定服务的实例.
但是这个简单的代码似乎不是单身
'use strict';
angular.module('animal', [])
.factory('Animal',function(){
return function(vocalization){
return {
vocalization:vocalization,
vocalize : function () {
console.log('vocalize: ' + this.vocalization);
}
}
}
});
angular.module('app', ['animal'])
.factory('Dog', function (Animal) {
return Animal('bark bark!');
})
.factory('Cat', function (Animal) {
return Animal('meeeooooow');
})
.controller('MainCtrl',function($scope,Cat,Dog){
$scope.cat = Cat;
$scope.dog = Dog;
console.log($scope.cat);
console.log($scope.dog);
//$scope.cat = Cat;
});
Run Code Online (Sandbox Code Playgroud)
我有点困惑你能解释一下我的问题是什么吗?
更新1 可能是我不是最流行的工具,但是@Khanh回复它将是一个更好的解释,在参考中它不是很清楚.
更新2
'use strict';
angular.module('animal', [])
.factory('Animal',function(){
return {
vocalization:'',
vocalize : function () {
console.log('vocalize: ' + this.vocalization);
} …Run Code Online (Sandbox Code Playgroud) 如何创建某种可以从我的所有控制器访问的utils包?
我的主模块中有这个路由代码:
'use strict';
angular.module('lpConnect', []).
config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/home', {template: 'views/home.html', controller: HomeCtrl}).
when('/admin', {template: 'views/admin.html', controller: AdminCtrl}).
when('/connect', {template: 'views/fb_connect.html', controller: MainAppCtrl}).
otherwise({redirectTo: '/connect'});
}]);
Run Code Online (Sandbox Code Playgroud)
我想要一个可以共同的功能HomeCtrl,AdminCtrl和MainAppCtrl.
我应该如何在AngularJS中做到这一点?
我已经能够让控制器使用$ on on listener $scope.$on.
但我没有看到任何关于如何获得服务来监听事件的文档.
我试过了$rootScope.$on,但这只允许一个听众.我想要多个服务中的监听器,无论他们的父控制器是否在范围内.
我开始在AngularJS开发.我很困惑这是否是在我的部分视图之间传递数据的正确设计.
现在我有一个加载页面,我做了一些请求.
function PeopleController($scope,$http,$location){
$http.get('/location/-79.18925/43.77596').
success(function(data){
$scope.savePeopleResponse(data);
$location.url('/test');
});
}
Run Code Online (Sandbox Code Playgroud)
然后在为/ test加载的视图中
我只是打电话
<div ng-controller="resultController">
<div class="blueitem">{{getResultForPeople()|json}}</div>
</div>
Run Code Online (Sandbox Code Playgroud)
[resultController]
function resultController($scope){
$scope.getResultForPeople = function(){
return $scope.getPeopleResponse();
}
}
Run Code Online (Sandbox Code Playgroud)
并且rootPcope中的savePeopleResponse和getResultForPeople被"缓存"
app.run(function($rootScope) {
var peopleResponse = {};
$rootScope.savePeopleResponse = function(data) {
peopleResponse = data;
console.log(data);
}
$rootScope.getPeopleResponse = function(){
return peopleResponse;
}
});
Run Code Online (Sandbox Code Playgroud)
现在你可以看到,如果这个应用程序变得越来越大,这将变得非常混乱.处理数据的最佳方法是什么,以便它跨控制器持续存在?