AngularJS: Фабрика и обслуживание? [дубликат]
этот вопрос уже есть ответ здесь:
EDIT Jan 2016: так как это все еще привлекает внимание. С тех пор, как я спросил об этом, я завершил несколько проектов AngularJS, и для тех, кого я в основном использовал factory
, создал объект и вернул объект в конце. Однако мои нижеприведенные утверждения по-прежнему верны.
EDIT: я думаю, что наконец-то понял основное различие между ними, и у меня есть пример кода для демонстрации. Я также думаю, что этот вопрос отличается от предлагаемого дубликат. Дубликат говорит, что служба не является инстанцируемой, но если вы настроите ее, как я продемонстрировал ниже, это действительно так. Сервис может быть настроен точно так же, как и фабрика. Я также предоставлю код, который показывает, где завод терпит неудачу над обслуживанием, которое никакой другой ответ, кажется, не делает.
если я настроил 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.говорите, однако, если я изменю VaderService на модуль.фабрика,код в контроллере больше не будет работать, и это главное отличие. С фабрикой, VaderService впрыснутое внутри к регулятору не экземпляр, поэтому вам нужно вернуть объект при настройке фабрики (см. мой пример в вопросе).
однако вы можете настроить службу точно так же, как вы можете настроить фабрику (т. е. вернуть объект) и сервис ведет себя точно так же, как завод
учитывая эту информацию, я вижу нет оснований для применения завод по обслуживание, обслуживание может сделать все фабрика может и больше.
исходный вопрос ниже.
Я знаю, что это было предложено много раз, но я действительно не вижу никакой функциональной разницы между фабриками и услуг. Я читал этот учебник: http://blogs.clevertech.biz/startupblog/angularjs-factory-service-provider
и это, кажется, дает достаточно хорошее объяснение, однако, я настроил свое приложение как следует:
.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>
приложение.js:
angular.module('MyApp', [
'MyApp.services',
'MyApp.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;
});
затем, когда я загружаю индекс.html я вижу "Присоединяйтесь к темной стороне люка", отлично. Именно так, как и ожидалось. Однако, если я изменю VaderService.js к этому (Примечание модуля.сервис вместо модуля.фабрика):
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;
});
обновить индекс.html (я убедился, что очистил кэш и сделал жесткую перезагрузку). Это работает ровно то же самое, что и с модулем.фабрика. Так в чем же реальная функциональная разница между ними??4 ответа:
сервис vs завод
разница между фабрикой и обслуживанием так же, как разница между функцией и объектом
Поставщик Фабрики
дает нам возвращаемое значение функции ie. Вы просто создаете объект, добавляете к нему свойства, а затем возвращаете тот же объект.Когда вы передаете эту услугу в свой контроллер, эти свойства объекта теперь будут доступны в этом контроллере через ваш завод. (Гипотетический Сценарий)
Синглтон и будет создан только один раз
многоразовые компоненты
Factory-отличный способ общения между контроллерами, такими как обмен данными.
можно использовать другие зависимости
обычно используется при обслуживании экземпляр требует сложной логики создания
не может быть введен в
Factory
иService
это просто оберткаprovider
.завод
Factory
может вернуть все, что может бытьclass(constructor function)
,instance of class
,string
,number
илиboolean
. Если вы возвращаетеconstructor
функция, вы можете создать экземпляр в вашем контроллере.myApp.factory('myFactory', function () { // any logic here.. // Return any thing. Here it is object return { name: 'Joe' } }
сервис
сервис не нужно ничего возвращать. Но вы должны назначить все
this
переменной. Потому что сервис будет создайте экземпляр по умолчанию и используйте его в качестве базового объекта.myApp.service('myService', function () { // any logic here.. this.name = 'Joe'; }
фактический код angularjs за службой
function service(name, constructor) { return factory(name, ['$injector', function($injector) { return $injector.instantiate(constructor); }]); }
это просто обертка вокруг
factory
. Если вы возвращаете что-то изservice
, тогда он будет вести себя какFactory
.
IMPORTANT
: возвращенный результат от фабрики и обслуживания будет кешем и таким же будет возвращен для всех регуляторов.когда я должен использовать их?
Factory
- это наиболее предпочтительно во всех случаях. Он может быть использован, когда у вас естьconstructor
функция, которая должна быть создана в различных контроллерах.
Service
вид
- Если вы используете сервис, вы получите экземпляр функции ("this" ключевое слово.)
- Если вы используете завод, вы получите значение, которое является возвращается путем вызова ссылки на функцию (оператор return in фабрика)
Фабрика и обслуживание наиболее обыкновенно используемые рецепты. Единственное различие между ними заключается в том, что рецепт обслуживания лучше работает для объектов пользовательского типа, в то время как фабрика может производить примитивы JavaScript и функции.