Technisch gesehen ist dies kein AngularJS Problem, sondern ein Merkmal javascript
zunächst, Funktionen, die Sie in einem Umfang definiert lokalen Zugriff auf Variable haben und Parameter seiner Eltern Umfang
function parent(arg){
var local
function child(){
// have access to arg and local
}
}
Scope funktioniert tatsächlich gut mit der Eltern-Kind-Analogie: Wenn Sie die Eltern sind und Sie eigenen ein Cookie, aus Grund sind Sie wohl, es mit Ihren Kindern zu teilen ... aber wenn Sie ein Kind sind ... Ihr Cookie ist Ihr Cookie, Ihre Eltern dürfen es nicht berühren :). Mit anderen Worten, kann innerer Umfang äußeren Umfang zuzugreifen, aber es funktioniert nicht in beiden Richtungen
So sollten Sie definitiv in der Lage sein zu tun:
$http.get('/plugin/' + key + '/js').success(function (data) {
if (data.length > 0) {
console.log(data, key); //as long as you can pass it to $http.get as an argument
//you can access it here
}
});
Zweitens wegen der ereignisgesteuerten Art von JavaScript, inner function store references to the outer function’s variables .Sie haben wahrscheinlich von diesen
Funktionen in Javascript zu hören sind Objekte
lokale Variablen und Parameter so private Mitglieder der Funktion sind:
function ObjectA(){ // define a constructor
var x = 10 // private variable
changeX : function(){
x = 20 // access and MODIFY a variable of parent scope
}
}
, wenn Sie, wie private Variable Werke verstehen in JavaScript, dann verstehen Sie im Grunde, was Verschluss ist. Daher ist es sehr wahrscheinlich, dass zum Zeitpunkt der Auslösung der Wert der übergeordneten Bereichsvariablen bereits geändert wurde. Um dies zu beheben, können Sie ein sofort aufgerufen Funktion Expression verwenden (IIFE)
$http.get('/plugin/' + key + '/js').success((function(currentKeyValue) {
return function(data) {
console.log(currentKeyValue, data);
// again, currentKeyValue is a REFERENCE to outer function's
// parameter. However, since String is passed by value in javascript
// currentKeyValue of outer scope is a DIFFERENT string that has the
// same value as KEY when it is invoked
}
})(key)); // immediately invoke the function passing the key as a parameter
Haben Sie versucht es direkt zugreifen? Es wird verfügbar sein, versuchen Sie 'console.log (key)' – Satpal
Ja, das funktioniert nicht, auch das Callback ist asynchron, so dass der Wert des Schlüssels bereits geändert werden konnte, wenn es aufgerufen wird. –
@TeamAIGD - Sie sollten definitiv Zugriff auf 'Schlüssel' innerhalb des Callbacks haben, und wenn' Schlüssel' sich so stark ändert, weisen Sie 'key' einer anderen Variablen direkt vor dem Aufruf zu und verwenden Sie diese Variable dann in der Rückrufen. – tymeJV