Comment passer d'une valeur à une AngularJS $http succès de rappel
Dans mon AngularJS application que je suis en train de faire la suite
$http.get('/plugin/' + key + '/js').success(function (data) {
if (data.length > 0) {
console.log(data);
//Here I would also need the value of 'key'
}
});
Maintenant, j'ai besoin d'accéder à la key
valeur au sein de la réussite de rappel, c'est à dire j'ai besoin de savoir la valeur qu'il avait lors de la get()
demande a été faite.
Tout "meilleure pratique" comment faire?
PS: je peux faire la suite, mais est-il une meilleure façon?
var key = config.url.split('/')[2];
Avez-vous essayé d'y accéder directement? Il sera disponible, essayez
Oui cela ne fonctionne pas, et que le rappel est asynchrone, donc la valeur de la clé pourrait avoir été changé déjà quand il est appelé.
Vous devez certainement avoir accès à
console.log(key)
Oui cela ne fonctionne pas, et que le rappel est asynchrone, donc la valeur de la clé pourrait avoir été changé déjà quand il est appelé.
Vous devez certainement avoir accès à
key
à l'intérieur de la fonction de rappel, et si key
va changer tant que ça, attribuer key
à une autre variable juste avant l'appel, puis utiliser cette variable dans la fonction de rappel.OriginalL'auteur Team AIGD | 2013-10-01
Vous devez vous connecter pour publier un commentaire.
Solution 1:
Solution 2 (mise à Jour par Jim Hong observation dans sa réponse):
Deuxième solution fonctionne pour l'itération avec des rappels. Je l'ai utilisé pour cela: for(var i = 0; i < somelist.longueur; i++){ doHttpRequest().rappel((function(i){ return function(data, etc) { // Faire quelque chose avec l'itérateur valeur } }(i))
La deuxième solution qui fonctionne pour moi. J'ai édité pour intégrer la correction mentionnée par Jim Hong dans sa réponse ci-dessous.
.le succès est obsolète. Utilisez ensuite la place
OriginalL'auteur geniuscarrier
Référence à @geniuscarrier
La solution de travail de mon côté est
Depuis l'utilisation de @geniuscarrier, je l obtenir
.
OriginalL'auteur Jim Horng
Techniquement parlant, ce n'est pas un AngularJS problème, mais une caractéristique de javascript
tout d'abord, fonctions que vous avez définie à l'intérieur d'un portée auront accès à variable locale et paramètre de ses parent portée
Portée fonctionne réellement bien avec le parent-enfant analogie: si vous êtes parent et vous propre un cookie, de la cause que vous welling pour le partager avec vos enfants...mais si vous êtes un enfant...votre cookie est votre cookie, votre mère n'est pas autorisé à le toucher :). En d'autres termes, l'intérieur du champ d'application peut accéder extérieur de la portée, mais il ne fonctionne pas deux manières à la fois
De sorte que vous devrait certainement être en mesure de le faire:
Deuxièmement, à cause de l'événement de javascript, fonction interne store références à l'extérieur de la fonction de variables. vous avez probablement entendu parler de cette
les variables locales et les paramètres sont ainsi privés des membres de la fonction:
si vous pouvez comprendre comment la variable privée fonctionne en javascript, alors vous avez essentiellement de comprendre ce que fermeture est. Ainsi, pour la fonction de rappel, il est très possible qu'au moment où elle est déclenchée, la valeur de la portée parent variable est déjà changé. Pour résoudre ce problème, vous pouvez utiliser un Immédiatement appelé la Fonction d'Expression (IIFE)
OriginalL'auteur watashiSHUN
Au lieu de polluer la portée ou de compliquer avec l'iif, un autre le moyen le plus propre est de créer une fonction de rappel et d'appel avec des paramètres;
OriginalL'auteur coderHASH64codingHASH46code
Ouf, j'ai été à la recherche pour cette réponse si longtemps, mais c'est bon, il est ici. Juste pour le mettre à jour, depuis l'héritage de la promesse méthodes
success
eterror
ont été dépréciés, et nous devrions utiliser la normethen
méthode à la place.Solution 2 en @geniuscarrier et @jim-rahel réponses peut être réécrite comme ceci:
OriginalL'auteur george007