javascript - change - AngularJS: ¿Qué es una fábrica?
page title angular 4 (4)
He estado trabajando mucho en Angular.js
y, en general, considero que es un marco interesante y poderoso.
Sé que ha habido muchas discusiones sobre Servicios vs. Fábricas vs. Proveedores versus Valores, pero todavía estoy bastante confundido acerca de lo que es una Factory
.
Factory se ha definido en otras discusiones de StackOverflow de la siguiente manera:
Suerte
Sintaxis: module.factory( ''factoryName'', function );
Resultado: cuando se declara factoryName como un argumento inyectable, se le proporcionará el valor que se devuelve al invocar la referencia de función pasada a module.factory.
Encuentro que esta explicación es muy difícil de entender y no aumenta mi comprensión de lo que es una fábrica.
¿Alguien podría tener alguna explicación o ejemplos de la vida real para compartir sobre qué es exactamente una Factory
y por qué debería usarla en lugar de un Service
, Provider
u otro?
Actualizar
Un service
contiene una referencia a cualquier objeto .
Una factory
es una función que devuelve cualquier objeto
Un provider
es una función que devuelve cualquier función
- phew -
Los servicios son en su mayoría objetos en los que se describe la clase de constructor del objeto. En algún lugar profundo del marco, se llama a la función Object.create () y luego puede usar un servicio llamando a su objeto y métodos usando un controlador. Factory, por otro lado, no crea un objeto por defecto y, por lo tanto, requiere que devuelva la ubicación completa del objeto una vez que haya terminado de definir todos los atributos y métodos.
Mis dos centavos sobre este tema. Soy muy novato y entiendo Angular JS y esta fue una de las cosas que me confundieron mucho y por lo tanto lo estudié en cierto detalle. He estado haciendo notas para dar entrevistas y esto puede ser útil para otros.
- el servicio y la fábrica hacen las mismas cosas de diferentes maneras
- ambos son inyectables
- para la mayoría de las cosas, use la sintaxis de fábrica
- Más fácil de entender
- hoy en día con es6 "servicio" se hace ya que convierte a clases es6 mejor
- es esencialmente abstracción de la lógica de negocios lejos del controlador
- si usa la lógica biz con controladores, entonces solo puede usar con controladores
- controlador es para poner datos en el alcance no procesando la lógica de biz largo
- Entonces, lo que sucede en el escenario anterior es que la lógica de operaciones complejas está ligada a los controladores. No para procesar datos. Así que pon pedacitos de servicios o de fábrica. Entonces su código es delgado y modular.
- los servicios son singletons
Por lo que entiendo, todos son más o menos lo mismo. Las principales diferencias son sus complejidades. Los proveedores son configurables en tiempo de ejecución, las fábricas son un poco más robustas y los servicios son la forma más simple.
Mira esta pregunta AngularJS: servicio vs proveedor vs fábrica
También esta gist puede ser útil para comprender las diferencias sutiles.
Fuente: https://groups.google.com/forum/#!topic/angular/hVrkvaHGOfc
jsFiddle: http://jsfiddle.net/pkozlowski_opensource/PxdSP/14/
autor: Pawel Kozlowski
var myApp = angular.module(''myApp'', []);
//service style, probably the simplest one
myApp.service(''helloWorldFromService'', function() {
this.sayHello = function() {
return "Hello, World!";
};
});
//factory style, more involved but more sophisticated
myApp.factory(''helloWorldFromFactory'', function() {
return {
sayHello: function() {
return "Hello, World!";
}
};
});
//provider style, full blown, configurable version
myApp.provider(''helloWorld'', function() {
// In the provider function, you cannot inject any
// service or factory. This can only be done at the
// "$get" method.
this.name = ''Default'';
this.$get = function() {
var name = this.name;
return {
sayHello: function() {
return "Hello, " + name + "!";
}
};
};
this.setName = function(name) {
this.name = name;
};
});
//hey, we can configure a provider!
myApp.config(function(helloWorldProvider){
helloWorldProvider.setName(''World'');
});
function MyCtrl($scope, helloWorld, helloWorldFromFactory, helloWorldFromService) {
$scope.hellos = [
helloWorld.sayHello(),
helloWorldFromFactory.sayHello(),
helloWorldFromService.sayHello()];
}
Una diferencia importante que veo es que puede ejecutar código personalizado en la fábrica. Pero, en un servicio, solo ocurre la creación de objetos.
myJs.factory(''Factory'', function() {
//Write custom code here
return {
Hello: function() {
return "Hello, World!"
}
};
});