beforeEach(inject(function (_$controller_, _$injector_) {
ctrl = _$controller_(...) // 1
ctrl = _$injector_.get('$controller')(...) // 2
}));
Was sind die Unterschiede und welcher Weg wird bevorzugt?
beforeEach(inject(function (_$controller_, _$injector_) {
ctrl = _$controller_(...) // 1
ctrl = _$injector_.get('$controller')(...) // 2
}));
Was sind die Unterschiede und welcher Weg wird bevorzugt?
Durch die Deklaration von _$controller_
in den Parametern der Funktion, die an inject()
übergeben wird, injiziert das Framework den $ controller-Dienst in die Funktion.
Aufruf $injector.get('$controller')
fragt explizit den $controller
Dienst für das Framework.
Also ist es im Grunde die alte Debatte "Abhängigkeit Injektion vs. Fabrik". Sollte das Framework die Abhängigkeit vom Test bereitstellen oder sollte der Test eine Abhängigkeit vom Framework verlangen?
Die erste ist definitiv in Produktionscode vorzuziehen: es macht Ihren Code testbar, und ist so, wie Sie das Framework verwenden sollen.
In Tests gibt es keinen signifikanten Unterschied, obwohl ich auch den ersten bevorzuge.
Es gibt keine Unterschiede in einem ES5-Kontext. Der erste ist der von Angular vorgeschlagene Weg, wie er von ihnen benutzt wird und auch in ihren Dokumenten und Tutorials.
Wenn Sie eine Funktion an inject
übergeben, wird sie von eckel beschriftet und analysiert die Funktionsparameter, um herauszufinden, welche Provider injiziert werden sollen. Dann ruft es die Funktion mit korrekten Providern auf. Zum Beispiel ruft Angular wahrscheinlich $inject.get
an, um die Instanz $controller
zu erhalten.
Es macht einen Unterschied für ES6, denn wenn Sie eine Pfeilfunktion stringieren, beginnt es nicht mit "function (..."), so dass Angular es vor Angular 1.5 nicht analysieren kann. In diesem Fall müssen Sie die Array-Notation verwenden: inject(['$controller', $controller => { ... }])
.
Vielen Dank für die Erklärung! – Eggy