Javascript 如何将值传递给AngularJS$http成功回调
在我的AngularJS应用程序中,我执行以下操作Javascript 如何将值传递给AngularJS$http成功回调,javascript,angularjs,callback,Javascript,Angularjs,Callback,在我的AngularJS应用程序中,我执行以下操作 $http.get('/plugin/' + key + '/js').success(function (data) { if (data.length > 0) { console.log(data); // Here I would also need the value of 'key' } }); 现在,我需要访问success回调中的键值,也就是说,我需要知道发出get()请求
$http.get('/plugin/' + key + '/js').success(function (data) {
if (data.length > 0) {
console.log(data);
// Here I would also need the value of 'key'
}
});
现在,我需要访问success回调中的键
值,也就是说,我需要知道发出get()
请求时它有哪个值
任何“最佳实践”如何做到这一点
附言:我可以做到以下几点,但是有更好的方法吗
var key = config.url.split('/')[2];
解决方案1:
$scope.key = key;
$http.get('/plugin/' + key + '/js').success(function (data) {
if (data.length > 0) {
console.log(data, $scope.key);
}
});
解决方案2(根据Jim Hong在其回答中的观察更新):
对@geniucarrier的引用 我这边的有效解决方案是
$http.get('/plugin/' + key + '/js').success((function(key) {
return function(data) {
console.log(key, data);
}
})(key));
自从使用@geniucarrier,我
数据未定义错误
从技术上讲,这不是AngularJS的问题,而是javascript的一个特性 首先,在作用域中定义的函数将可以访问其父作用域的局部变量和参数 Scope实际上与亲子类比很吻合:如果你是父母,你拥有一块饼干,当然你很想和你的孩子分享……但是如果你是孩子,你的饼干就是你的饼干,你的父母不允许触摸它:)。换句话说,内部作用域可以访问外部作用域,但它不能双向工作 因此,您肯定能够做到:
$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
}
});
其次,由于javascript的事件驱动特性,。你可能听说过这个
javascript中的函数是对象
因此,局部变量和参数是函数的私有成员:
function ObjectA(){ // define a constructor
var x = 10 // private variable
changeX : function(){
x = 20 // access and MODIFY a variable of parent scope
}
}
如果您能够理解私有变量在javascript中是如何工作的,那么您基本上理解了什么是闭包。因此,对于回调函数,很可能在触发它时,父范围变量的值已经更改。要解决此问题,可以使用立即调用的函数表达式(IIFE)
与污染作用域或使iif复杂化不同,另一种更干净的方法是创建回调函数并使用参数调用它
var myCallBack = function (key) {
return function (data) {
if (data.length > 0) {
console.log(data, key);
}
}
}
$http.get('/plugin/' + key + '/js').success(myCallBack(key));
呸,我一直在寻找这个答案,但很好,它就在这里。只是更新一下,因为传统的promise方法
success
和error
已经被弃用,我们应该使用标准的then
方法
@geniucarrier和@jim horng answers中的解决方案2可以重写如下:
$http.get('/plugin/' + key + '/js').then(
(function(key) {
return function(data) {
console.log(key, data);
}
})(key),
function(data) {
//error handle
});
你试过直接访问它吗?它将可用,请尝试
console.log(key)
是,这不起作用,而且回调是异步的,因此在调用key时key的值可能已经更改了。@TeamAIGD--您肯定可以访问回调中的key
,如果key
将要更改那么多,在调用之前将key
分配给不同的变量,然后在回调中使用该变量。第二种解决方案适用于回调的迭代。我用它来做这个:for(vari=0;I$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
var myCallBack = function (key) {
return function (data) {
if (data.length > 0) {
console.log(data, key);
}
}
}
$http.get('/plugin/' + key + '/js').success(myCallBack(key));
$http.get('/plugin/' + key + '/js').then(
(function(key) {
return function(data) {
console.log(key, data);
}
})(key),
function(data) {
//error handle
});