2016-03-30 16 views
0

Um die Abhängigkeit zu Angular hinzufügen, das ist, was docs zu tun sagt:AngularJS: Richtlinie/Dependency Injection

Source

//inject directives and services. 
var app = angular.module('fileUpload', ['ngFileUpload']); 
app.controller('MyCtrl', ['$scope', 'Upload', function ($scope, Upload) {... 

Aber können wir Richtlinie injizieren direkt in die Steuerung wie folgt aus:

var app = angular.module('fileUpload', []); 
app.controller('MyCtrl', ['ngFileUpload','$scope', 'Upload', function (ngFileUpload,$scope, Upload) {... 
  1. Wenn nicht, was ist der Grund dafür, dass diese Funktion dem Controller nicht zur Verfügung steht?
  2. Gibt es eine Möglichkeit, Abhängigkeit zu injizieren, wenn ein bestimmter Controller geladen wird?
+2

Module können nicht direkt in Steuerungen eingespeist werden. Sie müssen zuerst in das Modul injiziert werden, und dann werden Dienste/Fabriken/Anbieter innerhalb dieser Module als Abhängigkeit zu diesem Controller hinzugefügt. –

+0

Korrekt. Aber warum? Es ist für uns nicht bequemer, Module auch über Controller zu injizieren. –

+1

Modularität und sauberer Code. Wenn Sie alles in den Controller injizieren, was ist dann der Grund, Module zu erstellen? –

Antwort

1

Keine Module sind im Wesentlichen die Basis oder eine "Toolbox", wenn Sie so wollen. Sie müssen ein Modul in ein anderes Modul einspeisen, damit es Zugriff auf seine "Werkzeuge" (Filter/Direktiven/Dienste usw.) haben kann. Der Grund dafür ist, dass das Modul für das Laden von Abhängigkeiten und die Reihenfolge von Operationen verantwortlich ist. Dies ist so, dass, wenn Sie ein "Werkzeug" von einem Modul in einen Controller anfordern, Sie sicher sein können, dass es dort ist (oder ein Fehler wird ausgelöst).

Module können andere Module als ihre Abhängigkeiten auflisten. Abhängig von einem Modul bedeutet dies, dass das erforderliche Modul geladen werden muss, bevor das anfordernde Modul geladen wird. Mit anderen Worten, die Konfigurationsblöcke der erforderlichen Module werden vor den Konfigurationsblöcken des anfordernden Moduls ausgeführt. Dasselbe gilt für die Laufblöcke. Jedes Modul kann nur einmal geladen werden, auch wenn mehrere andere Module es erfordern.

Wenn Sie ein Modul in ein anderes injizieren, sagen Sie "Modul A erfordert Dinge von Modul B". Jetzt, wenn Sie ein bestimmtes Werkzeug benötigen, wenn Sie es in den Controller injizieren, so dass Sie Zugriff auf dieses spezielle Werkzeug haben.

So betrachtet:

var app = angular.module('myApp', ['ngFileUpload']); 

app.controller('MyCtrl', ['$scope', 'Upload', function ($scope, Upload) { 

    ..... 

    Upload.upload(uploadData).then(function (resp) { 
     //success 
    }, null, function (evt) { 
     //upload progress 
    }); 
    ..... 

}]); 

So weil Sie ngFileUpload den Controller in den myApp Modul injizieren kann nun injizieren, um den Upload Service vom ngFileUpload Modul und die Steuerung braucht sich keine Sorgen zu machen, wenn der Dienst vorhanden ist (wenn es ist nicht, dass Sie einen Einspritzungsfehler von angular erhalten).

+0

Danke, das löscht den # 1 Punkt. –

+1

Ich meine, das ist eine einfache und allgemeine Idee von Modulen. Wenn Sie wirklich etwas über sie wissen möchten, lesen Sie die Angular Docs on Module: https: // docs.angularjs.org/guide/module –

+1

Und zu Ihrem anderen Punkt in den Kommentaren oben benötigen Sie nur ein Modul-Tool in der Steuerung, wenn Sie den Dienst injizieren. Wenn man das eine Modul in ein anderes einspeist, sagt man im Wesentlichen: "Ich brauche etwas in diesem Modul, stelle sicher, dass es geladen ist, bevor ich es bin", dass du nicht sagst: "Jeder Controller braucht alles" –