2017-11-13 1 views
2

Ich bin mit ionic1 und ich habe mehrere Controller jeder ist für verschiedene Seite. Betrachten Sie die folgenden Injektionen:Wie Dependency-Injektion in mehreren Controller in einem einzigen Schritt

.controller('login', function($scope, $http, $location, $state,$rootScope , auth,$timeout) 
.controller('Home', function($scope, $rootScope, $http, $state,$location, $ionicNavBarDelegate, $timeout, auth, getData) 

Also auf ich etwa 10 von ihnen haben. Die meisten Injektionen sind für alle Controller wie $scope,$rootScope und einige andere üblich. Also ich möchte wissen, ob es einen einzigen Liner gibt, um alle Abhängigkeiten auf einmal zu injizieren.

Antwort

1

Injizieren alle Abhängigkeiten widerspricht dem Konzept der Abhängigkeitsinjektion (neben der Tatsache, dass Controller lokale Abhängigkeiten haben können). Eine Abhängigkeit ist, was ein Controller von abhängig macht.

Wenn mehrere Controller mit übereinstimmenden Abhängigkeiten vorhanden sind, können sie den Basiscontroller erben. Wenn untergeordnete Controller eigene Abhängigkeiten haben sollen, kann dies mit einer Basisklasse geschehen, die der Controller-Instanz automatisch Abhängigkeiten zuweist. Controller-Vererbung funktioniert am besten mit ES6-Klassen:

class BaseController { 
    static get $inject() { 
    return ['$rootScope', '$scope', '$timeout']; 
    } 

    constructor(...deps) { 
    this.constructor.$inject.forEach((depName, i) => { 
     this[depName] = deps[i]; 
    }); 
    } 
} 


class SomeController extends BaseController { 
    static get $inject() { 
    return [...super.$inject, 'some']; 
    } 

    constructor(...deps) { 
    super(...deps); 
    ... 
    } 
} 

app.controller('SomeController', SomeController); 
+0

Wird ES6 in der ionischen 1-Umgebung unterstützt? –

+0

Ich war auf der Suche nach einem One Liner, aber ich denke der alte Weg ist besser als die ES6 Methode, die Sie vorschlagen –

+1

Es hängt nicht von Ionic ab, sondern von Ihren Zielplattformen, im Grunde Android 5+ und iOS 9+, siehe https://caniuse.com/#feat=es6-class. ES6-Klassen sind syntaktischer Zucker und sind zu Illustrationszwecken aufgeführt. Es ist möglich, Vererbung in ES5 durchzuführen, aber es wird wesentlich mehr Code beinhalten, der schwerer zu verstehen ist. Also ja, meistens ist der "alte Weg" einfacher und macht den Job. Beachten Sie, dass Sie Services mit Anmerkungen versehen und die Liste der Deps wiederholen müssen. Hier könnten die DRY-Controller-Klassen kürzer und sauberer sein. – estus

3

Sie könnten eine Factory erstellen, die einige der am häufigsten verwendeten Abhängigkeiten zurückgibt.

Etwas wie folgt aus:

angular 
    .module('app') 
    .factory('common', common); 

common.$inject = ['$rootScope', '$http', '$state']; 

function common($rootScope, $http, $state) { 
    var service = { 
    $rootScope: $rootScope, 
    $http: $http, 
    $state: $state 
    }; 

    return service; 
} 

dann brauchen Sie nur den common Dienst in Ihrem Controller enthalten und es wie folgt verwendet werden: common.$rootScope.

this helps :)

bearbeiten Wie @estus in den Kommentaren gesagt, mit $scope wäre es scheitern, weil $scope eine lokale Abhängigkeit ist und nicht verfügbar in Dienstleistungen/Fabriken. Dies sollte kein Problem sein, da ich empfehlen würde, $scope so weit wie möglich zu vermeiden (controllerAs Syntax verwenden)

+2

Es wird fehlschlagen, weil '$ scope' lokale Controllerabhängigkeit ist, während die Frage ist, wie man wiederholten '$ scope' loswerden kann (ohne Zweifel, es ist das am meisten wiederholte dep). – estus

Verwandte Themen