2014-05-22 28 views
6

In genere ho appreso che l'implementazione della funzione può avere un nome per gli argomenti di funzione purché sia ​​fornita nell'ordine corretto. Ciò rende la funzione astratta dal mondo esterno e i nomi locali non hanno alcun effetto sull'output. L'implementatore ha tutti i diritti per le variabili locali. Tuttavia, in angolare JS, sembra contrastare intuitivo per avere qualcosa di simile:

function Controller($scope) 
{ 
    $scope.name = "Something"; 
} 

Se metto "bar" c'è invece "$ scope" Ottengo un errore. Questa non è la normale funzione a cui siamo abituati. Credo che abbia qualcosa a che fare con DI, ma qualcuno può spiegare questo concetto? Trovo difficile definirlo una "funzione" perché dipende dal mondo esterno, in particolare dal nome dell'argomento.

Se DI è la vera ragione, qualcuno può farmi sapere come viene richiamato? Normalmente posso pensare a DI fare del bene quando voglio prendere in giro un oggetto per un caso di test. In questo caso, quale ruolo gioca DI?

Nei normali scenari di DI che ho trovato, l'argomento che viene passato, fa un servizio per la funzione come say foo displayTime (clock) {clock.qualcosa}. Il tempo è solo un servizio per la funzione. Comunque qui trovo che, $ scope e framework sembrano fare la magia con la funzione che è solo un modo dichiarativo di esprimere la logica.

Edit: JS Apparentemente pause minify questa funzionalità e abbiamo bisogno di fare come in How do the function argument names in Angular.js objects connect to other objects?

+2

Angolare valuta effettivamente gli argomenti (utilizzando Funzione.toString) e inietta la risorsa giusta, questa è una delle cose sconcertanti che impari quando inizi con angolare! vedere qui: http://stackoverflow.com/questions/16949889/how-do-the-function-argument-names-in-angular-js-objects-connect-to-other-object –

+1

"In normali scenari di DI I si sono imbattuti in, l'argomento che viene passato fa un servizio per la funzione "... Questo è anche il caso in Angolare, gli ambiti sono comunque un po 'speciali ... https://github.com/angular/angular.js/ wiki/Understanding-Scopes che entra nei dettagli sugli ambiti e https://docs.angularjs.org/guide/scope che probabilmente si attacca di più a come dovresti usarli Ma potresti anche iniettare il tuo servizio di clock definito come: myApp.service ('clock', ['otherDependency', function (od) {this.something = "Im a clock!";}]); – Jens

risposta

7

Un modo per definire un controller è in questo modo:

myApp.controller("TestController", ['$scope', function(bar) { 
    // now "bar" is actually the scope variable 
}]); 

Tutta la ragione che le opere angolari come questo è a causa del modo in cui fa l'iniezione di dipendenza. Fondamentalmente cerca le dipendenze (es. $scope) e tenta di iniettarle in base al nome della variabile. Ciò significa che se si assegna un nome diverso a $scope, si tenta di iniettare quell'altro elemento. bar non è qualcosa che l'angolare sa iniettare in modo da ottenere un valore undefined anziché lo $scope che stavi aspettando.

L'esempio sopra riportato funziona perché ho utilizzato un array per separare i nomi delle variabili che verranno immesse dalle variabili stesse. Ora non devi usare la parola $scope ma devi mantenere le variabili nello stesso ordine. L'intero concetto di DI è troppo complicato da spiegare in un breve post quindi vi consiglio di leggere più su di esso sul sito di angolare qui: https://docs.angularjs.org/tutorial/step_05

Il Punto di DI (in angolare)

Nel caso in cui vi state chiedendo - perché andare a tutti questi problemi? Perché non semplicemente iniettare automaticamente $scope nella prima variabile che hai nella lista? La risposta è: personalizzazione della flessibilità &. Con angolare, è possibile definire i servizi e le fabbriche, quindi iniettarli nei controller. Questo ti dà la possibilità di definire routine, oggetti o anche controlli personalizzati e poi usarli su tutti i controller che vuoi. Senza DI - nulla di tutto ciò sarebbe possibile. Ancora una volta, questi sono concetti piuttosto complicati quindi consiglio di iniziare con un balzo di fiducia che "funziona", imparando a conoscere i servizi, quindi in seguito puoi tornare indietro e leggere di più. A quel punto penso che DI dovrebbe avere molto più senso!

Buona fortuna!

+0

Interessante. Quindi, in pratica, vuoi dire che la funzione è destinata a essere chiamata da Angular e non dal mondo esterno? Non è puramente una funzione JS? – Nishant

+1

@Nishant Puoi chiamare la funzione come la definisci da qualsiasi cosa, ma ovviamente non ti farà molto bene. Indipendentemente da ciò, dovresti usare la sintassi drew_w qui, in quanto significa anche che puoi tranquillamente minificare il tuo codice senza rompere la funzionalità. – Jens

+0

@Nishant Usa DI per iniettare variabili, * ma * è ancora una pura funzione javascript. Consiglio di leggere di più su DI per capire cosa sta succedendo qui! –

Problemi correlati