2016-04-07 16 views
0
beforeEach(inject(function (_$controller_, _$injector_) { 
    ctrl = _$controller_(...) // 1 
    ctrl = _$injector_.get('$controller')(...) // 2 
})); 

Was sind die Unterschiede und welcher Weg wird bevorzugt?

Antwort

3

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.

+0

Vielen Dank für die Erklärung! – Eggy

0

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 => { ... }]).