631 Stimmen

Verwirrt über Service vs. Fabrik

So wie ich es verstehe, gebe ich innerhalb einer Fabrik ein Objekt zurück, das in einen Controller injiziert wird. Wenn ich mich in einem Dienst befinde, behandle ich das Objekt mit this und nichts zurückgeben.

Ich bin davon ausgegangen, dass ein Dienst immer ein Singleton und dass ein neues Fabrikobjekt wird in jeden Controller injiziert. Doch wie sich herausstellt, ist ein Fabrikobjekt auch ein Singleton?

Beispielcode zur Demonstration:

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;
});

Beim Wechsel user.first en ACtrl es stellt sich heraus, dass user.first en BCtrl wird ebenfalls geändert, z. B. User ein Singleton ist?

Meine Annahme war, dass eine neue Instanz in einem Controller mit einer Fabrik injiziert wurde?

1voto

Oskar Punkte 2446
  • Mit dem Werk erstellen Sie tatsächlich eine Objekt innerhalb des Werk und geben Sie es zurück.
  • Mit dem Dienstleistung Sie haben gerade eine Standardfunktion die den this Schlüsselwort zur Definition Funktion.
  • Mit dem Anbieter gibt es eine $get die Sie definieren und die verwendet werden kann zu erhalten das Objekt, das die die Daten zurückgibt.

1voto

Pritam Banerjee Punkte 16396

Es gibt drei Möglichkeiten, Geschäftslogik in AngularJS zu behandeln: ( Inspiriert von Yaakovs Coursera-Kurs AngularJS ), die sind:

  1. Dienst
  2. Fabrik
  3. Anbieter

Hier werden wir nur über Folgendes sprechen Dienst gegen Fabrik

SERVICE :

Syntax:

app.js

 var app = angular.module('ServiceExample',[]);
 var serviceExampleController =
              app.controller('ServiceExampleController', ServiceExampleController);
 var serviceExample = app.service('NameOfTheService', NameOfTheService);

 ServiceExampleController.$inject = ['NameOfTheService'] //very important as this protects from minification of js files

function ServiceExampleController(NameOfTheService){
     serviceExampleController = this;
     serviceExampleController.data = NameOfTheService.getSomeData();
 }

function NameOfTheService(){
     nameOfTheService = this;
     nameOfTheService.data = "Some Data";
     nameOfTheService.getSomeData = function(){
           return nameOfTheService.data;
     }     
}

index.html

<div ng-controller = "ServiceExampleController as serviceExample">
   {{serviceExample.data}}
</div>

Die wichtigsten Merkmale von Service:

  1. Faul instanziiert : Wenn der Dienst nicht injiziert wird, wird er nie instanziiert. Um ihn zu verwenden, müssen Sie ihn also in ein Modul injizieren.

  2. Singleton : Wenn es in mehrere Module injiziert wird, haben alle nur Zugriff auf eine bestimmte Instanz. Aus diesem Grund ist es sehr praktisch, Daten über verschiedene Controller hinweg gemeinsam zu nutzen.

FACTORY

Lassen Sie uns nun über die Factory in AngularJS sprechen

Werfen wir zunächst einen Blick auf die Syntax :

app.js :

var app = angular.module('FactoryExample',[]);
var factoryController = app.controller('FactoryController', FactoryController);
var factoryExampleOne = app.factory('NameOfTheFactoryOne', NameOfTheFactoryOne);
var factoryExampleTwo = app.factory('NameOfTheFactoryTwo', NameOfTheFactoryTwo);

//first implementation where it returns a function
function NameOfTheFactoryOne(){
   var factory = function(){
      return new SomeService();
    }
   return factory;
}

//second implementation where an object literal would be returned
function NameOfTheFactoryTwo(){
   var factory = {
      getSomeService : function(){
          return new SomeService();
       }
    };
   return factory;
}

Nun werden die beiden oben genannten im Controller verwendet:

 var factoryOne = NameOfTheFactoryOne() //since it returns a function
 factoryOne.someMethod();

 var factoryTwo = NameOfTheFactoryTwo.getSomeService(); //accessing the object
 factoryTwo.someMethod();

Merkmale der Fabrik:

  1. Diese Arten von Dienstleistungen folgen dem Fabrikplanungsmuster . Die Fabrik kann als zentrale Stelle betrachtet werden, die neue Objekte oder Methoden erstellt.

  2. So entstehen nicht nur singuläre, sondern auch anpassbare Dienste.

  3. En .service() Methode ist eine Werk die immer dieselbe Art von Dienst erzeugt, nämlich ein Singleton. Es gibt keine einfache Möglichkeit, sein Verhalten zu konfigurieren. Das .service() Methode wird normalerweise als Abkürzung für etwas verwendet, das keinerlei Konfiguration erfordert.

1voto

Ishpreet Punkte 4262

Für eine kurze und einfache Erklärung siehe https://stackoverflow.com/a/26924234/5811973 .

Ausführliche Erklärung siehe https://stackoverflow.com/a/15666049/5811973 .

Auch aus der angularJs-Dokumentation: enter image description here

0voto

Sourabh Ranka Punkte 165

Sie können den Unterschied mit dieser Analogie verstehen - Betrachten Sie den Unterschied zwischen einer normalen Funktion, die einen Wert zurückgibt, und einer Konstruktorfunktion, die mit dem Schlüsselwort new instanziiert wird, so dass die Erstellung einer Fabrik der Erstellung einer normalen Funktion ähnelt, die einen Wert (Primitiv oder ein Objekt) zurückgibt, während die Erstellung eines Dienstes der Erstellung einer Konstruktorfunktion (OO-Klasse) ähnelt, deren Instanz wir mit dem Schlüsselwort new erstellen können. Die einzige Sache, die hier zu beachten ist, ist, dass, wenn wir Service-Methode verwenden, um Dienste zu erstellen, wird es automatisch erstellen Instanz von ihm mit Abhängigkeit Injektion Mechanismus von AngularJS unterstützt

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X