Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将值传递给AngularJS$http成功回调_Javascript_Angularjs_Callback - Fatal编程技术网

Javascript 如何将值传递给AngularJS$http成功回调

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()请求

在我的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()
请求时它有哪个值

任何“最佳实践”如何做到这一点

附言:我可以做到以下几点,但是有更好的方法吗

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
    });