2016-12-16 4 views
1

Warum oder warum sollte ich Winkel $ Injector nicht selbst injizieren statt getrennte und benannte Abhängigkeiten als Parameter in die Konstruktorfunktion eines Controllers zu injizieren?

+1

"* $ injector wird verwendet, um Objektinstanzen wie vom Provider definiert zu erhalten, Typen zu instanziieren, Methoden aufzurufen und Module zu laden. * [Angularjs Dokumente für' $ injector'] (https://docs.angularjs.org/api/auto/service/$ injektor). " Es ist eine Frage des Nutzens, ich sehe insbesondere keine Gründe dafür, dies auf einem Controller zu verwenden. –

Antwort

1

Während des $ Injektor-Dienst würde gut funktionieren, kann ich aus zwei Gründen ein, warum ich persönlich würde es nie tun:

  1. Es ist ein Streit, der völlig unnötig ist
  2. Es verschleiert, was die Abhängigkeiten für eine Komponente oder sind.

Zur Veranschaulichung sehen Sie den Unterschied zwischen diesen beiden:

app.controller('myController', function($scope, myService) { 
}) 

und

app.controller('myController', function($injector) { 
    var $scope = $injector.get('$scope'); 
    var myService= $injector.get('myService'); 
}) 

Die beiden obigen Beispielen das gleiche tun, aber ich glaube, die erste in der Absicht viel klarer ist .

Beachten Sie jedoch, dass es Situationen gibt, in denen der direkte Einsatz des Injektors erforderlich ist: wenn eine zirkuläre Abhängigkeit besteht. Nehmen Sie diese (dumme) Beispiel:

app.factory('service1', function(service2) { 
    return { 
     someFunction: function() { 
      return service2.otherFunction(); 
     }, 
     otherFunction: function() { 
      return 'result from service 1 other function'; 
     } 
    } 
}); 
app.factory('service2', function(service1) { 
    return { 
     someFunction: function() { 
      return service1.otherFunction(); 
     }, 
     otherFunction: function() { 
      return 'result from service 2 other function'; 
     } 
    } 
}); 

Dieses in einem Fehler zurückkehren würde, da der Injektor nicht service1 und service2 vor dem anderen schaffen. In diesem Fall könnten Sie Folgendes tun:

app.factory('service1', function(service2) { 
    return { 
     someFunction: function() { 
      return service2.otherFunction(); 
     }, 
     otherFunction: function() { 
      return 'result from service 1 other function'; 
     } 
    } 
}); 
app.factory('service2', function($injector) { 
    return { 
     someFunction: function() { 
      var service1 = $injector.get('service1'); 
      return service1.otherFunction(); 
     }, 
     otherFunction: function() { 
      return 'result from service 2 other function'; 
     } 
    } 
}); 

Hinweis, wie service1 wird nicht mehr in service2 injiziert, werden aber nur von dem Injektor gefragt, wenn die entsprechende Funktion aufgerufen wird, wobei an diesem Punkt nicht mehr da ist eine Race-Bedingung .

+1

Es gibt Anwendungsfälle, in denen Ihre Abhängigkeit verfügbar sein kann oder nicht, was mit dem Dienst $ injector geschehen kann. Ein Beispiel wäre der Dienst "$ animate", bei dem viele Bibliotheken dieses "$ injector" -Muster verwenden – devqon

Verwandte Themen