AngularJS: Фабрика и Сервис? [Дубликат]
На этот вопрос уже есть ответ:
AngularJS: Сервис против провайдера против фабрики 31 ответ EDIT январь 2016: Так как это все еще привлекает внимание. С тех пор, как я спросил об этом, я завершил несколько проектов AngularJS, и для тех, кого я в основном использовал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, код в контроллере больше не будет работать, и это главное отличие. С фабрикой VaderService, введенный в контроллер, являетсян экземпляр, поэтому вам нужно вернуть объект при настройке фабрики (см. мой пример в вопросе).
Однако вы можете настроить сервис точно так же, как вы можете настроить фабрику (в IE она возвращает объект) и сервис ведет себя точно так же, как завод
Даю эту информацию, я вижуе @ нет причина использовать фабрику по обслуживанию, сервис может сделать все, что фабрика может и многое другое.
Первоначальный вопрос ниже.
Я знаю, что об этом спрашивали много раз, но я действительно не вижу никакой функциональной разницы между фабриками и сервисами. Я прочитал этот урок:http: //blogs.clevertech.biz/startupblog/angularjs-factory-service-provide
И это, кажется, дает достаточно хорошее объяснение, однако я настроил свое приложение следующим образом:
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. Так в чем же реальная функциональная разница между двумя ??