AngularJS Dependency Injection Components

โšก Slimme samenvatting

Dependency Injection in AngularJS geeft componenten de objecten waar ze van afhankelijk zijn, in plaats van ze die objecten zelf te laten bouwen. Zo ontvangen controllers services zoals $http van de framework-injector tijdens de runtime.

  • ๐Ÿ”˜ Definitie: Inversie van controle maakt het mogelijk dat een externe injector alle afhankelijkheden levert die een component nodig heeft.
  • โ˜‘๏ธ Recepten: waarde, fabriek, service, leverancier en constante register injecteerbare objecten.
  • โœ… Waardecomponent: Een sleutel-waardepaar bereikt de controller als een gewone functieparameter.
  • ๐Ÿงช Service: Een singleton-object stelt herbruikbare functies beschikbaar die controllers op naam injecteren.
  • ๏ธ annotatie: Inline array- of $inject-notatie zorgt ervoor dat injectie blijft werken na minificatie.
  • ๐Ÿ“Š Versie-opmerking: De ondersteuning voor AngularJS is in januari 2022 beรซindigd; Angular injecteert nu via inject().

AngularJS dependency injection: een service doorgeven aan een controller via de injector.

Wat is afhankelijkheidsinjectie in AngularJS?

Afhankelijkheid injectie in AngularJS is een softwareontwerppatroon dat inversie van controle implementeert voor het oplossen van afhankelijkheden. Het bepaalt hoe componenten hun afhankelijkheden behouden. Het kan worden gebruikt bij het definiรซren van de componenten of bij het leveren van run- en configuratieblokken van de module. Hiermee kunt u de componenten herbruikbaar, testbaar en onderhoudbaar maken.

Inversie van controle: Het betekent dat objecten geen andere objecten creรซren waarop ze vertrouwen om hun werk te doen. In plaats daarvan krijgen ze deze objecten van een externe bron. Dit vormt de basis van AngularJS Dependency Injection, waarbij het ene object afhankelijk is van het andere; het primaire object neemt niet de verantwoordelijkheid om het afhankelijke object te maken en vervolgens de methoden ervan te gebruiken. In plaats daarvan maakt een externe bron (die in AngularJS het AngularJS-framework zelf is) het afhankelijke object en geeft dit aan het bronobject voor verder gebruik.

โš ๏ธ Versie-opmerking: De ondersteuning voor AngularJS is in januari 2022 beรซindigd., zonder beveiligingspatches. Moderne Angular injecteert via @Injectable providers en injecteren()De onderstaande code blijft historisch.

Laten we dus eerst begrijpen wat een afhankelijkheid is.

Modelklasse die afhankelijk is van een database, met een service die is geรฏnjecteerd om de gegevens op te halen.

Het bovenstaande diagram toont een eenvoudig voorbeeld van AngularJS-afhankelijkheidsinjectie van een alledaags ritueel bij het programmeren van databases.

  • Het 'Model'-vakje toont de "Model class" die normaal gesproken wordt gemaakt om te interacteren met de database. Dus nu is de database een dependency voor de "Model class" om te functioneren.
  • Door afhankelijkheidsinjectie creรซren we een service om alle informatie uit de database te halen en in de modelklasse te komen.

In de rest van deze handleiding gaan we dieper in op dependency injection en hoe dit wordt bereikt in angularjs.

Welke component kan als afhankelijkheid worden geรฏnjecteerd in AngularJS?

In AngularJS worden afhankelijkheden geรฏnjecteerd met behulp van een "injecteerbare factory-methode" of "constructorfunctie".

Deze componenten kunnen worden geรฏnjecteerd met de componenten โ€˜serviceโ€™ en โ€˜waardeโ€™ als afhankelijkheden. We hebben dit gezien in een eerder onderwerp met de $http-service.

Een AngularJS module registreert injecteerbare objecten via vijf recepten.

Recept Wat het registreert
waarde Een gereed object, onzichtbaar voor configuratieblokken.
fabriek Een functie waarvan de retourwaarde wordt geรฏnjecteerd.
service Een constructor die eenmaal is geรฏnstantieerd met new
leverancier Een configureerbaar recept dat $get beschikbaar maakt
constante Een vaste waarde die leesbaar is in configuratieblokken.

We hebben al gezien dat de $http-service binnen AngularJS kan worden gebruikt om gegevens uit een MySQL of MS SQL Serverdatabase via een PHP web applicatie.

De $http-service wordt normaal gesproken op de volgende manier vanuit de controller gedefinieerd.

sampleApp.controller ('AngularJSController', function ($scope, $http)

Wanneer de $http-service nu in de controller is gedefinieerd, zoals hierboven weergegeven. Het betekent dat de controller nu afhankelijk is van de $http-service.

Wanneer de bovenstaande code wordt uitgevoerd, zal AngularJS de volgende stappen uitvoeren;

  1. Controleer of de โ€œ$http-serviceโ€ is geรฏnstantieerd. Omdat onze โ€œcontrollerโ€ nu afhankelijk is van de โ€œ$http serviceโ€, moet een object van deze dienst beschikbaar worden gesteld aan onze controller.
  2. Als AngularJS ontdekt dat de $http-service niet is geรฏnstantieerd, gebruikt AngularJS de 'factory'-functie om een โ€‹โ€‹$http-object te construeren.
  3. De injector binnen AngularJS levert vervolgens een instantie van de $http-service aan onze controller voor verdere verwerking.

Annotatieformulieren: Impliciete annotatie Het leest parameternamen, dus minificatie maakt het onbruikbaar. Inline array-notatie en $inject blijven wel werken; ng-strict-di op ng-app verwerpt impliciete annotaties.

Nu de afhankelijkheid in onze controller is geรฏnjecteerd, kunnen we nu de noodzakelijke functies binnen de $http-service aanroepen voor verdere verwerking.

Voorbeeld van afhankelijkheidsinjectie

In dit voorbeeld leren we hoe we afhankelijkheidsinjectie in AngularJS kunnen gebruiken.

Afhankelijkheidsinjectie kan op 2 manieren worden geรฏmplementeerd

  1. Eรฉn daarvan is via de โ€œWaardecomponentโ€
  2. Een andere is via een โ€œServiceโ€

Laten we de implementatie van beide manieren in meer detail bekijken.

1) Waardecomponent

Dit concept is gebaseerd op het creรซren van een eenvoudige JavaScript object en dit doorgeven aan de controller voor verdere verwerking.

Dit wordt geรฏmplementeerd met behulp van de onderstaande twee stappen

Stap 1) Maak een JavaScript het object door gebruik te maken van de `value`-component en koppel het aan je hoofdmodule van AngularJS.

Het waardecomponent heeft twee parameters: de ene is de sleutel en de andere is de waarde van het component. JavaScriptobject dat wordt aangemaakt.

Stap 2) Toegang tot de JavaScriptobject van de AngularJS-controller

<! DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Event Registration</title>

</head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
<body ng-app="sampleApp">

<div ng-controller="AngularJSController">
    <h3> Guru99 Global Event</h3>
    {{ID}}
</div>
<script>

    var sampleApp = angular.module('sampleApp',[]);
    sampleApp.value("TutorialID", 5);
    sampleApp.controller('AngularJSController', function($scope,TutorialID) {
        $scope.ID =TutorialID;
    });

</script>
</body>
</html>

De bovenstaande code voert de onderstaande stappen uit.

  1. sampleApp.value("TutorialID", 5);

    De `value`-functie van de AngularJS-module wordt gebruikt om een โ€‹โ€‹sleutel-waardepaar te creรซren met de naam "TutorialID" en de waarde "5".

  2. sampleApp.controller('AngularJSController', function ($scope,TutorialID)

    De TutorialID-variabele wordt nu als functieparameter toegankelijk voor de controller.

  3.  $scope.ID =TutorialID;

    De waarde van TutorialID, namelijk 5, wordt nu toegewezen aan een andere variabele genaamd ID in de $bereik object. Dit wordt gedaan zodat de waarde 5 van de controller naar de view kan worden doorgegeven.

  4. {{ID}}

    De ID-parameter wordt in de weergave weergegeven als een expressie. De uitvoer van '5' wordt dus op de pagina weergegeven.

Wanneer de bovenstaande code wordt uitgevoerd, wordt de uitvoer weergegeven zoals hieronder

Browseruitvoer van het voorbeeld van de waardecomponent, waarbij de geรฏnjecteerde TutorialID van 5 wordt afgedrukt.

2) Service

Service wordt gedefinieerd als een singleton JavaScriptobject dat bestaat uit een set functies die u wilt blootstellen en in uw controller wilt injecteren.

De parameter "$http" is bijvoorbeeld een service in AngularJS die, wanneer deze in je controllers wordt geรฏnjecteerd, de benodigde functionaliteit biedt.

( get() , query() , save() , remove(), delete() ).

Deze functies kunnen vervolgens dienovereenkomstig vanaf uw controller worden opgeroepen.

Laten we eens kijken naar een eenvoudig voorbeeld van hoe u uw eigen service kunt maken. We gaan een eenvoudige optelservice maken die twee getallen optelt.

<! DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Event Registration</title>

</head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
<body>
<h3> Guru99 Global Event</h3>

<div ng-app = "mainApp" ng-controller = "DemoController">
    <p>Result: {{result}}</p>
</div>
<script>
    var mainApp = angular.module("mainApp", []);

    mainApp.service('AdditionService', function(){
        this.ADDITION = function(a,b) {
            return a+b;
        }
    });

    mainApp.controller('DemoController', function($scope, AdditionService) {

            $scope.result = AdditionService.ADDITION(5,6);
    });
</script>

</body>
</html>

In het bovenstaande voorbeeld worden de volgende stappen uitgevoerd

  1.  mainApp.service('AdditionService', function()

    Hier maken we een nieuwe service aan met de naam 'AdditionService', gebruikmakend van de serviceparameter van onze hoofdmodule van AngularJS.

  2.  this.ADDITION = function(a,b)

    Hier maken we een nieuwe functie genaamd ADDITION aan binnen onze service. Dit betekent dat wanneer AngularJS onze AdditionService instantieert in onze controller, we vervolgens toegang hebben tot de functie 'ADDITION'. In deze functiedefinitie geven we aan dat deze functie twee parameters accepteert, a en b.

  3.  return a+b;

    Hier definiรซren we de body van onze ADDITION-functie, die simpelweg de parameters optelt en de opgetelde waarde retourneert.

  4.  mainApp.controller('DemoController', function($scope, AdditionService)

    Dit is de belangrijkste stap waarbij dependency injection een rol speelt. In onze controllerdefinitie verwijzen we nu naar onze 'AdditionService'-service. Wanneer AngularJS dit ziet, zal het een object van het type 'AdditionService' instantiรซren.

  5.  $scope.result = AdditionService.ADDITION(5,6);

    We hebben nu toegang tot de functie 'ADDITION', die is gedefinieerd in onze service, en kennen deze toe aan het $scope-object van de controller.

Dit is dus een eenvoudig voorbeeld van hoe we onze service kunnen definiรซren en de functionaliteit van die service in onze controller kunnen injecteren.

Veelgestelde vragen

De service instantieert je constructor eenmalig met `new`. De factory voert je functie uit en injecteert de waarde die deze retourneert, dus primitieve gegevenstypen werken ook.

De constante bereikt configuratieblokken en is niet zichtbaar voor decorators. De waarde wordt na de providers geregistreerd, waardoor configuratieblokken deze niet kunnen zien.

Elke applicatie heeft รฉรฉn injector die namen oplost, instanties retourneert via `get` en functies met hun afhankelijkheden uitvoert via `invoke`.

Minifiers hernoemen parameters naar enkele letters, waardoor de injector zoekt naar een provider met de naam 'a'. Expliciete annotatie behoudt de echte namen.

Registreer de aanbieder, vermeld zijn module Controleer de afhankelijkheidsarray en de spelling. Niet-geannoteerde geminificeerde code geeft ook een foutmelding.

@Injecteerbare providers plus constructorparameters, of de injecteren() Functie binnen veldinitialisaties. Een hiรซrarchische injector lost elk token op.

Machine learning-hulpmiddelen trace elke geรฏnjecteerde naam overal controllers en diensten, rangschikkoppeling en signaleer risicovolle aanbieders. Ingenieurs verifiรซren de resultaten.

GitHub-copiloot Het genereert op verzoek inline arrays en $inject-annotaties, en agentic voert scans uit in complete mappen. Revdoor iew gegenereerde annotaties.

Vat dit bericht samen met: