EDIT Январь 2016: Так как это все еще привлекает внимание. Спрашивая об этом, я выполнил несколько проектов AngularJS, и для тех, кого я использовал в основном factory
, создал объект и вернул объект в конце. Мои утверждения ниже все еще верны.
EDIT: Я думаю, что, наконец, понимаю основное различие между ними, и у меня есть пример кода для демонстрации. Я также думаю, что этот вопрос отличается от предлагаемого дубликата. Дубликат говорит, что сервис не является реальным, но если вы его настроите, как я показал ниже, это на самом деле. Услуга может быть настроена точно так же, как и factory. Я также предоставлю код, который показывает, где factory выходит из строя через службу, что никакой другой ответ, похоже, не делает.
Если я настроил VaderService так (например, как сервис):
var module = angular.module('MyApp.services', []);
module.service('VaderService', function() {
this.speak = function (name) {
return 'Join the dark side ' + name;
}
});
Тогда в моем контроллере я могу это сделать:
module.controller('StarWarsController', function($scope, VaderService) {
$scope.luke = VaderService.speak('luke');
});
При обслуживании, VaderService, введенный в контроллер, создается, поэтому я могу просто вызвать VaderService.speak, однако, если я изменю VaderService на module.factory, код в контроллере больше не будет работать, и это главное отличие. При использовании factory встраиваемый в контроллер контроллер VaderService не создается, поэтому вам нужно вернуть объект при настройке factory (см. Мой пример в вопросе).
Однако вы можете настроить службу точно так же, как вы можете настроить factory (IE вернуть объект), а служба ведет себя точно так же, как factory
Учитывая эту информацию, я не вижу причин использовать factory по сервису, сервис может делать все factory и может.
Оригинальный вопрос ниже.
Я знаю, что это было задано много раз, но я действительно не вижу никакой функциональной разницы между фабриками и услугами. Я прочитал этот учебник: 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>
</body>
</html>
app.js:
angular.module('MyApp', [
'MyApp.services',
'MyApp.controllers'
]);
controllers.js:
var module = angular.module('MyApp.controllers', []);
module.controller('StarWarsController', function($scope, VaderService) {
var luke = new VaderService('luke');
$scope.luke = luke.speak();
});
VaderService.js
var module = angular.module('MyApp.services', []);
module.factory('VaderService', function() {
var VaderClass = function(padawan) {
this.name = padawan;
this.speak = function () {
return 'Join the dark side ' + this.name;
}
}
return VaderClass;
});
Затем, когда я загружаю index.html, я вижу "Присоединиться к темной стороне люка", отлично. Точно так, как ожидалось. Однако, если я изменю VaderService.js на это (обратите внимание на module.service вместо module.factory):
var module = angular.module('MyApp.services', []);
module.service('VaderService', function() {
var VaderClass = function(padawan) {
this.name = padawan;
this.speak = function () {
return 'Join the dark side ' + this.name;
}
}
return VaderClass;
});
Затем перезагрузите index.html(я убедился, что я опустошил кеш и сделал жесткую перезагрузку). Он работает точно так же, как и с module.factory. Итак, какова реальная функциональная разница между двумя?